sqli-labs Less9-10 基于时间的盲注
这一关的题目为:GET - Blind - Time based. - Single Quot
,提示了是时间盲注,时间盲注是结合 if 语句和 sleep()函数来判断语句是否正确,下面的URL提交后页面会延迟5秒钟,说明语句执行了
1 | http://43.247.91.228:84/Less-9/?id=1' and if(1=1,sleep(5),0)--+ |
这句的意思是如果1=1
处的语句正确,就执行`sleep(5) 函数,所以就可以以这个为判断依据,修改Less-8 中的脚本进行注入。
修改过程
首先修改check()
函数,将之前依据页面内容判断改为根据页面响应时间判断,具体使用到time
模块、datetime
模块以及requests
模块,下面是简单介绍
time
在 Python 文档里, time 是归类在 Generic Operating System Services 中,换句话说, 它提供的功能是更加接近于操作系统层面的。通读 文档 可知,time 模块是围绕着 Unix Timestamp 进行的。
该模块主要包括一个类 struct_time ,另外其他几个函数及相关常量。 需要注意的是在该模块中的大多数函数是调用了所在平台 C library 的同名函数, 所以要特别注意有些函数是平台相关的,可能会在不同的平台有不同的效果。另外一点是,由于是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 - 2038 之间,如果你写的代码需要处理在前面所述范围之外的日期,那可能需要考虑使用 datetime 模块更好。
用法
1 | stramp = time.time() #获取当前时间戳 |
datetime
datetime 基于 time 进行了封装,提供了更多实用的函数。
1 | datetime.replace(name=value) # 前面所述各项属性是 read-only 的,需要此方法才可更改 |
这里请求网页的方式从
1 | response = request.urlopen(url + parse.quote(newurl)).read().decode() |
改为了
1 | res=requests.get(url +newurl) |
区别
这里面的区别在于urlopen打开URL网址,url参数可以是一个字符串url或者是一个Request对象,返回的是http.client.HTTPResponse对象.http.client.HTTPResponse对象大概包括read()、readinto()、getheader()、getheaders()、fileno()、msg、version、status、reason、debuglevel和closed函数,其实一般而言使用read()函数后还需要decode()函数,返回的网页内容实际上是没有被解码或的,在read()得到内容后通过指定decode()函数参数,可以使用对应的解码方式。
requests.get()方法请求了站点的网址,然后打印出了返回结果的类型,状态码,编码方式,Cookies等内容
修改了这些后,还需要在其他函数构造URL的地方将语句用if括起来并且加上sleep()函数,使URL拼合后类似在本文开头的那种形式,下面是修改后的脚本
脚本
1 | # 基于时间盲注脚本 |
这一关的名字为:GET - Blind - Time based. - Double Quot
,经过尝试,这个和第九关的区别就是这一关是使用双引号闭合,所以将脚本中的单引号改为双引号就行了
总结
修改为基于时间的盲注脚本并不复杂,但是需要把握好sleep()函数的时间,如果过小会使得脚本运行过慢,但是时间设置的太短,会使出错的概率变大,所以这个地方需要根据自己的情况设定。
参考
本文作者 : W4rnIn9
原文链接 : http://joner11234.github.io/article/bf579251.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!