这个代码审计有点意思
进入题目
意思是让我们逐个绕过咯
那就先第一个绕过:(需要的储备知识为正则表达式)
这个正则的意思就是:
‘^’:这个符号的意思是开头是以23333开头,$绕过就用的换行符来绕过:%0a -> 这是换行符
因为$的默认匹配是行尾,所以也就说,用%0a来定义为行尾,就能绕过。
所以我们要绕过第1st就要先绕过这个正则,所有创建的payload:?num=23333%0a
成功绕过第一个
开始绕过第二个:**(知识储备如下)**
is_numeric()函数的作用是:你传入的值必须是数字。**也就是说 $string_1 应该是一个数字串**
md5()就是md5函数的加密
strtr函数作用:https://www.w3school.com.cn/php/func_string_strtr.asp
简单来说就是:md5_1这个加密字符串,会被逐个替换:** 举个例子:**
echo strtr(“Hilla Warld”,”ia”,”eo”) 那么它输出的是 hello world
这里有个细节:md5()这个函数的加密最大的字母只有到f(说个题外话,md5无法识别字符串)。其实后面**的xhp毫无作用。只是把c替换成0**
“==”与”===”的区别:
结果分别是true和flase
这里**就解释一下第一个为什么是true: **
“==”只是对值的比较(将两边的值化为同类型的再比较)。对于”==”的比较而言,若一方为数字,另一方为字符串或空或null,都会将数字一方转换为0,再做比较。
“===”则是对值和类型进行比较。
所有**找个脚本跑一下找两个md5相同并且替换掉C也相同的数字**
于是找到这两个
所有建立payload则是:http://nctf2019.x1ct34m.com:60005/?num=23333%0A&str1=2120624&str2=9081940
成功绕过第二个
最后开始绕过第三个:
首先第一个substr_count()该函数的意思为:计算某个字符串在变量中出现的次数:
所有题目的意思就是说:$这些变量里的不能出现这些符号,应该为0;
‘_’与’%5f’都是空格的意思,那我们怎么样才能打出q**_w_q呢**
用’%20’或者’+’也可以
所以q_w_q=q.w.q=q+w+q=q%20w%20q。
接下来就是下面的cat,先来读一篇文章吧:https://blog.csdn.net/u012062455/article/details/78560403
最重要的一点就是: tac和cat显示的顺序是相反的
那就好办了嘛:果断payload:http://nctf2019.x1ct34m.com:60005/?num=23333%0A&str1=2120624&str2=9081940&q.w.q=tac+*
这里的payload为什么前面q.w.q是用’.’ 因为php会把特殊的符号如’ { ‘转义成下划线 ‘ _ ‘;
上面文章表示 tac要有 空格
*为通配符:
通配符是一种特殊语句,主要有星号(*)和问号(?),用来模糊搜索文件。当查找文件夹时,可以使用它来代
替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正
的字符。 实际上用“*Not?pad”可以对应Notepad\MyNotepad
【*可以代表任何字符串;?仅代表单个字符串,但此单字必须存在】;
星号(*)可以使用星号代替0个或多个字符.
**问号(?)可以使用问号代替一个字符.**