Once More
题目
题干链接:http://www.shiyanbar.com/ctf/1805
啊拉?又是php审计。已经想吐了。
hint:ereg()函数有漏洞哩;从小老师就说要用科学的方法来算数。格式:CTF{}
hint:ereg()函数有漏洞哩;从小老师就说要用科学的方法来算数。格式:CTF{}
解题链接: http://ctf5.shiyanbar.com/web/more.php
解法:两个知识点
- 是可以用科学技术法表示数字
- ereg()存在00阶段漏洞
过程
1.查看代码,过第1、3个判断
1.1ereg()函数,查看用法
PHP 函数 ereg()
语法
int ereg(string pattern, string originalstring, [array regs]);
定义和用途
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。
Return Value
如果匹配成功返回true,否则,则返回false
Example
下面是一段代码,这段代码复制并粘贴到一个文件中并验证结果。
<?php $email_id = "admin@tutorialspoint.com"; $retval = ereg("(\.)(com$)", $email_id); if( $retval == true ) { echo "Found a .com<br>"; } else { echo "Could not found a .com<br>"; } $retval = ereg(("(\.)(com$)"), $email_id, $regs); if( $retval == true ) { echo "Found a .com and reg = ". $regs[0]; } else { echo "Could not found a .com"; } ?>
这将会产生以下结果:
Found a .com Found a .com and reg = .com
1.2.1查看矛盾点是strpos()函数中的*-*匹配
1.2.2strpos()函数
查找 “php” 在字符串中第一次出现的位置:
<?php echo strpos("You love php, I love php too!","php"); ?>
1.3综合1.1和1.2,构造%00*-*
,截断ereg对*-*的判断,也满足strpos中的查找。
2.科学计数法过第2个判断。
2.1科学计数法中: 1.99714E13=19971400000000
2.2构造满足strlen<8并且大于9999999的数:9E9=9000000000
是科学计数法最短同时数也最大的了。
3.合并条件就是9E9%00*-*
4.提交发现%被转义,直接在url中修改参数more.php?password=9E9%2500*-*
结果:
5.得到flag
6.这里strlen()没被截断,构造的参数是3位数字1位空3位符号总共7位正好满足条件,多一位都不行。