打开是一个输入框,要求输入域名,尝试输入baidu.com进行测试
并无任何回显,测试下127.0.0.1本地地址
执行成功,并出现ping命令结果,这里很容易联想到命令注入,尝试进行命令拼接注入
但测试了常用的拼接字符,都显示Invalid URL,怀疑被过滤了,通过Fuzz进行测试
`
~
!
@
#
$
%
^
&
*
(
)
-
_
=
+
[
]
{
}
|
\
;
:
'
"
,
.
<
>
/
?
&&
||
<>
发现@
,-
,.
,/
未被过滤,该回显为空
单独对该未过滤字符进行测试
发现未过滤字符在url栏上会被进行url编码
在url栏测试宽字符,即ascii码超过127的url编码即可,也就是%81-%ef
发现任意一个宽字符,都会出现报错信息
是一串html代码,为了更加直观,直接复制为html文件
很直观的看到报错界面,根据错误提示,可以知道是因为将输入的参数传到了后端的django服务中进行解析,而django设置了编码为gbk,导致错误编码了宽字符(超过了ascii码范围1-127)。
XCTF原题中,给出提示:
根据提示可以知道,可以通过在参数中注入 @ 来读取文件,并配合宽字节报错来获取文件内容。
结合页面报错,可以知道django项目的路径:/opt/api
如果做过django开发的,应该都会知道django项目下一般有个settings.py
文件,用于网站配置。当然,网站数据库路径也在setting.py
配置文件当中。
可以尝试读取settings.py,看下配置信息中是否相关的线索,注意django项目生成时settings.py会存放在以项目目录下再以项目名称命名的文件夹下面
。,也就是/opt/api/api/settings.py
翻了下,发现数据库配置信息
同理,可以通过@尝试读取数据库配置
@/opt/api/database.sqlite3
翻了好久,尝试搜索flag、ctf关键字,找到flag