2017swpu-ctf总结
今年是我第一次出题感受很多,就分析几道我印象最深刻的题吧
你能进入后台吗?
这道题主要是考察php_screw还有md5加密开启true过后的注入
phpscrew加密在github上有解密工具
工具地址
至于绕过md5($password,true)这个其实主要就是通过md5后的hex值转换成字符串如果包含'or'
字符串:ffifdyop
满足上述条件
flag!flag!
这是我出的题本来是想出thinkphp的洞的,不过已经有一个thinkphp的题了就放弃了。首先是一个文件读取http://39.106.13.2/web2/file.php?file=php://filter/read=convert.base64-encode/resource=check
(这道题之前出了些问题,我回滚了一次,结果那个快照是我很久以前打的,导致有些大师傅读到的源码是我之前的测试源码,不是我最后决定的源码。已经被吊打)
源码是一个waf,前半部分过滤一些危险参数,不过像mid,substr,length这些很多都没有过滤绕过很简单,重点是后半部分。通过parse_url
分割url后去匹配过滤select。因为是跨表,没有select确实没法注入这里用到了一个小tips。parseurl对url解析的时候有问题///x.php?file=xxx
这种格式会返回false,preg_match就不会匹配到任何字符串了。这样就绕过了后面那个参数最后的payload=http://39.106.13.2///web2/articleshowAll.php?aid=1'/(ascii(mid((select flag from flag)from(1)))>0)%23
心得:其实后来觉得这道题出的不怎么好,因为parse_url这样用真的很少,感觉大家学到了一个蛮鸡肋的东西。下次出题注意。
我们来做小游戏吧
大佬出的题,先膜一波。
注入点其实蛮好找的
function load_session()
{
$res = $this->dbConn->query('SELECT data FROM ' . $this->session_table . " WHERE session_id = '" . $this->session_id . "' and ip = '" . $this->_ip . "'");
$session = $res->fetch_array();
if (empty($session))
{
$this->insert_session();
}
else
{
$GLOBALS['_SESSION'] = unserialize($session['data']);
}
}
session_id
和ip
是可控的不过重点是加上了全局转义,当时就被这里难住了,没有想到办法引入单引号。
$tmp_session_id = substr($this->session_id, 0, 32);
if ($this->gen_session_key($tmp_session_id) == substr($this->session_id, 32)){
$this->session_id = $tmp_session_id;
}
其实忽略了这段代码,这个是对session_id进行截取截取前32位这里对 $this->session_id
做了截取,而 $this->session_id
的值是可以通过 $_COOKIE[$this->session_name]
控制的,所以我们可以通过在 cookie 里面传入 %00 ,这样经过全局转义后,赋值给 $this->session_id
就成了