在i春秋的线下培训基地–Web安全就业班CTF比赛中我遇到了这样一些坑:今天列出来给各位看光瞧瞧:
我们先访问目标网站:http://106.75.26.211:1111/
![]()
一句很和谐的话告诉我们这里没有任何东西,但是实际上呢?我们看看网页源代码:
![]()
看吧CTF的东西哪有那么简单?!于是乎访问这个页面:
![]()
完整代码如下:
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = 23, Position 2 = 38
Branch analysis from position: 23
Jump found. Position 1 = 26, Position 2 = 35
Branch analysis from position: 26
Jump found. Position 1 = 29, Position 2 = 32
Branch analysis from position: 29
Jump found. Position 1 = 34
Branch analysis from position: 34
Jump found. Position 1 = 37
Branch analysis from position: 37
Jump found. Position 1 = 40
Branch analysis from position: 40
Return found
Branch analysis from position: 32
Jump found. Position 1 = 37
Branch analysis from position: 37
Branch analysis from position: 35
Jump found. Position 1 = 40
Branch analysis from position: 40
Branch analysis from position: 38
Return found
filename: C:\ctf\index.php
function name: (null)
number of ops: 44
compiled vars: !0 = $a, !1 = $b, !2 = $c
line # * op fetch ext return operands
---------------------------------------------------------------------------------
2 0 > EXT_STMT
1 ECHO 'do+you+know+Vulcan+Logic+Dumper%3F%3Cbr%3E'
3 2 EXT_STMT
3 BEGIN_SILENCE ~0
4 FETCH_R global $1 '_GET'
5 FETCH_DIM_R $2 $1, 'flag1'
6 END_SILENCE ~0
7 ASSIGN !0, $2
4 8 EXT_STMT
9 BEGIN_SILENCE ~4
10 FETCH_R global $5 '_GET'
11 FETCH_DIM_R $6 $5, 'flag2'
12 END_SILENCE ~4
13 ASSIGN !1, $6
5 14 EXT_STMT
15 BEGIN_SILENCE ~8
16 FETCH_R global $9 '_GET'
17 FETCH_DIM_R $10 $9, 'flag3'
18 END_SILENCE ~8
19 ASSIGN !2, $10
6 20 EXT_STMT
21 IS_EQUAL ~12 !0, 'fvhjjihfcv'
22 > JMPZ ~12, ->38
7 23 > EXT_STMT
24 IS_EQUAL ~13 !1, 'gfuyiyhioyf'
25 > JMPZ ~13, ->35
8 26 > EXT_STMT
27 IS_EQUAL ~14 !2, 'yugoiiyhi'
28 > JMPZ ~14, ->32
9 29 > EXT_STMT
30 ECHO 'the+next+step+is+xxx.zip'
10 31 > JMP ->34
11 32 > EXT_STMT
33 ECHO 'false%3Cbr%3E'
13 34 > > JMP ->37
14 35 > EXT_STMT
36 ECHO 'false%3Cbr%3E'
16 37 > > JMP ->40
17 38 > EXT_STMT
39 ECHO 'false%3Cbr%3E'
19 40 > NOP
22 41 EXT_STMT
42 ECHO '%3C%21--+index.php.txt+%3F%3E%0D%0A%0D%0A'
43 > RETURN 1
branch: # 0; line: 2- 6; sop: 0; eop: 22; out1: 23; out2: 38
branch: # 23; line: 7- 7; sop: 23; eop: 25; out1: 26; out2: 35
branch: # 26; line: 8- 8; sop: 26; eop: 28; out1: 29; out2: 32
branch: # 29; line: 9- 10; sop: 29; eop: 31; out1: 34
branch: # 32; line: 11- 13; sop: 32; eop: 33; out1: 34
branch: # 34; line: 13- 13; sop: 34; eop: 34; out1: 37
branch: # 35; line: 14- 16; sop: 35; eop: 36; out1: 37
branch: # 37; line: 16- 16; sop: 37; eop: 37; out1: 40
branch: # 38; line: 17- 19; sop: 38; eop: 39; out1: 40
branch: # 40; line: 19- 22; sop: 40; eop: 43
path #1: 0, 23, 26, 29, 34, 37, 40,
path #2: 0, 23, 26, 32, 34, 37, 40,
path #3: 0, 23, 35, 37, 40,
path #4: 0, 38, 40,
do you know Vulcan Logic Dumper?<br>false<br><!-- index.php.txt ?>
看吧就这些,两眼一懵逼,这是神马?!汇编语言?!好好瞧了瞧,我还是找找万能的度娘吧:使用最后几行代码搜到这样一篇文章:PHP一些优先级的问题,看看大神的文章再结合以前学的粗浅的汇编,明白了一些!简单的说就是讲PHP语言的运行流程展示出来细化了过程,可以结合这篇大神的文章的代码相互对比理解:PHP一些优先级的问题
在index.php.txt中有提示,代码是如何运行的,我们需要访问http://106.75.26.211:1111/index.php这个页面,在这个页面中进行GET提交数据,分析可知有三个变量,当这三个变量同时赋予相应的值,就可以执行下一步操作;如下:
![]()
提交数据
![]()
页面会回显提示:返回一个压缩包
![]()
现在我们需要下载这个压缩:
![]()
压缩包里面是一个网站的源代码:当时我的第一反应是,需要在本地搭环境,运行网站获取flag,后来我发现我错了,错的离谱!
首先我把源代码解压,使用phpstudy搭建网站,访问这个网站:
![]()
这是一个很普通的网站,但是呢需要我获取flag,应该是SQL注入,需要代码审计,找出注入点,于是修改配置文件,连接数据库;后来发现,这个网站没有建立表的语句!flag是怎么爆出来呢?当时就脑子宕机了,后来才反应过来,应该是线上有一个网站,把源代码给我们,就是进行代码审计,再找出注入点,在线上获取flag,免得我们搞崩了网站…………
在网站的注册页面中,
register.php
$number = is_numeric($_POST['number']) ? $_POST['number'] : 1;
$username = $db->safe_data($_POST['username']);
$password = $db->my_md5($_POST['password']);
dbmysql.class.php
public function safe_data($value){
if( MAGIC_QUOTES_GPC ){
stripcslashes($value);
}
return addslashes($value);
}
对输入的username进行了过滤,单引号被转意,number的非数字字符被过滤,而且还有长度限制……
在登录页面中
$username = $db->safe_data($_POST['username']);
$password = $db->my_md5($_POST['password']);
$number = is_numeric($_POST['number']) ? $_POST['number'] : 1;
$username = trim(str_replace($number, '', $username));
同样的对username,number进行了过滤,但是多了一个对username使用number对数字替换的功能,所以我们可以在登录login.php中对网站进行注入:
这里必须使用%00进行单引号绕过,%00是一个特殊的字符;
首先我们使用burpsuite对网站进行抓包,在burpsuite中注入,比较方便(直接访问login.php网页抓包):
![]()
在login.php中填写必要信息
![]()
burpsuite抓取数据包
![]()
action中将数据发送到repeater中
![]()
接下来我们就构造语句进行注入了:
number=0&username=%00' and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),1),1) #&password=pass&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
构造好语句,点击“go”发送数据
![]()
返回了表名,有一个flag表,这应该就是我们需要的;
然后我们再构造语句爆出flag
![]()
构造好语句,点击“go”发送数据
![]()
爆出了flag,但是只有一部分,所以我们还需要修改substr中参数,截取数据,
![]()
修改参数
![]()
爆出后面一部flag,这样flag就全部获取了,只需要拼接一下就可以了。