这道题是今年bjdctf第一次比赛的题,一道挺不错的简单题目,又学到了不少姿势。
扫描得到源码
首先打开题目是一个需要登录的页面,一开始还以为是SQL注入,尝试了一会也没啥结果,后来看了下wp才知道是swp泄露,于是访问index.php.swp看到了源码
1 |
|
这段代码的主要意思就是判断输入的password的md5的前6位是否等于'6d0bc1'
,如果等于的话,就将Hello,'.$_POST['username'].'
写入到"public/".get_hash().".shtml"
中,即将输入的username写入到一个shtml文件中
爆破md5
我们首先可以用下面这个脚本去爆破一下md5前六位为'6d0bc1'
的字符串,当然这里选的是纯数字,刚刚好可以爆破出来,比赛的时候不知道有没有提示啥的
1 | import hashlib |
最后得到的结果为2020666
然后我们就可以随便输个用户名去登录一下试试,发现是能成功登录的
还有一个要点就是写入的shtml文件名是随机的,经过一番寻找以后发现在network中直接给了我们文件名
去访问一下这个地址发现确实是写入了
SSI注入获得flag
那么怎么去获取flag呢?这里就是要用到SSI注入的知识了,这里直接引用大佬的解释
利用SSI注入漏洞,我们可以在username变量中传入ssi语句来远程执行系统命令。
1 <!--#exec cmd="命令"-->(SSI 注入全称Server-Side Includes Injection,即服务端包含注入。SSI 是类似于 CGI,用于动态页面的指令。SSI 注入允许远程在 Web 应用中注入脚本来执行代码。SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。从技术角度上来说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。IIS和Apache都可以开启SSI功能)
(SSI注入的条件:
1.Web 服务器已支持SSI(服务器端包含)
2.Web 应用程序未对对相关SSI关键字做过滤
3.Web 应用程序在返回响应的HTML页面时,嵌入用户输入)
然后我们就可以在用户名中输入<!--#exec cmd="ls ../"-->
密码输入2020666
去执行命令了
在上级目录发现了flag文件,读取就可以拿到flag