0x00
web 400 homework
网站是一个提交作业的网站,登录验证码是输入字符的md5前四位一致则能通过验证,数字跑一下可以得到正确验证码。
1 | import md5 pre = "5bc0" for x in xrange(1, 1000000): a = md5.md5(str(x)) m = a.hexdigest() if m[:4] == pre: print x break |
进入后有一个作业提交点,可以上传任意文件,但是php文件内容会被改为badmen,在查看自己历史提交处存在SQL注入,看了一下数据库中没有敏感数据,支持union可以读写文件。
首先根目录有三个提示文件:phpinfo.php;info.php和readme.html,其中phpinfo可以看到网站使用PHP7使用了OPcache。
php7下的OPcache,可以通过在OPcache的缓存目录下写入x.php.bin文件,请求网站目录下的x.php文件时会加载缓存文件并解析,如果bin文件中写入webshell,则php文件将加载这段webshell代码。
上传时文件加时间戳重命名,目录无法绕过。OPcache的目录权限非常低,因此可以用sqli写入。目录格式为
/OPcache path/system ID/web path/
使用python程序计算出的机器码后,获得当前站的文件缓存目录为
/tmp/OPcache/39b005ad77428c42788140c6839e6201/var/www/html/upload/
上传2016223565-xxx.php文件,本地生成webshell bin文件,使用into dumpfile在目录写入2016223565-xxx.php.bin getshell。
0x01
获取到shell以后在phpinfo中查看到网站disable founction中禁用了php几乎所有文件的操作函数,在phpinfo中看到启用了sendmail函数库,因此可以用LD_PRELOAD绕过php disable function。
编译动态库上传到服务器,php调用执行动态库中的system命令。1
<?php
putenv("LD_PRELOAD=/path/xxx.so");
mail("a@localhost","","","","");
?>
使用echo /* > /tmp/file命令获取根文件目录,找到flag文件
但是系统读文件命令都被清空了,使用c的文件读写,读到flag值。
0x02
web 100 foundpasswd
系统存在很多处sql注入,甚至开始时还存在一个重复注册漏洞,因此直接可以注册HHHH,登录管理后台,然后在后台用户管理处可以联合查询。
loadfile下载到登录口的源代码。
找到用户表名和字段名。
在查询处获取到HHHH密码则为flag。
后来重复注册被修复了,xss盲打管理员cookie找到后台的联合查询注入点后select管理员密码。