花了一个多小时列了一下自己后面的清晰规划
想实现所谓理想就要有干劲,一字卷,打打鸡血,压榨一下自己


php太多了,至少CTF里几乎都是,有点消化不了

一、知识点

PHP特性
CMS代码审计
过滤函数 缺陷绕过

二、php部分内置函数(检测过滤对比)

1、==和===

= 赋值
== 弱类型比较(仅值相等)
=== 强类型比较(先判断类型再判断值)

2、MD5比较漏洞

MD5生成哈希值,用于验证

弱比较:0e开头看做科学计数法
强比较:数组输入返回NULL

num[]=1 passwd[]=2 NULL

0e开头的md5和原值:
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064

https://blog.csdn.net/qq_38603541/article/details/97108663

3、intval()

提取变量整数值 intval(a,b) 获取a的整数值

默认十进制 如果加上了b=0 则检测a的格式 十六进制就是0x开头 八进制就是0开头
CTF中防御把注入语句转换为整数
https://www.runoob.com/php/php-intval-function.html

绕过:abc123=0 就是进制转换 注意进制就可以

4、strpos()

从0开始,返回子串首次出现位置,未找到返回false,大小写敏感

strpos(a,b)是b在a中第一次出现的位置 空格也算一个字符
https://www.runoob.com/php/func-string-strpos.html

绕过:换行(%0a,\n) 空格(%20)绕过

5、in_array()

数组中搜索,转换为数字,in_array(a,b,c)在数组a中搜索b值,并输出一些文本 ,b可以是一个变量
关键在于c是否被设置?true就难绕

c未设置就是==
c设置为true 则是===
https://www.runoob.com/php/func-array-in-array.html

弱类型绕过:a写为1 and 2=2 和1shell都会被转化为1
或者a=true和1e0

6、preg_match()

正则,最烦人的来了,我要疯了

preg_match(a,b,c):根据a这个正则表达式的规则,从b中搜索,存入c这个数组中,一般b都是传入的参

参数:
i 不区分大小写
\d{3} 匹配3位数
^ 匹配开头
\$ 匹配结尾
m 多行模式,改变^和\$,使其匹配每行的行首行尾 /^line/m
s 单行模式,使.号匹配所有字符,包括换行符\n
x 忽略正则中的空白和注释

绕过:
(1)数组绕过返回false,b=select[] * from users
(2)换行符绕过,preg_match("/^admin/", $_GET['user']

适用场景:正则包含起始锚点 ^,锚点^匹配行首为%0a,随后匹配第二行admin
(3)大小写绕过,输入大小写混合就行
(4)多行模式绕过,preg_match("/exit/", "ex\ni\nt");
(5)空字符绕过,preg_match("/\.php$/", "shell.php%00.jpg");

一些常见的正则过滤的绕过方式


过滤所有数字字母
preg_match("/[A-Za-z0-9]+/",$code)

/
非字母数字及长度
if(!preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)

/
大概率是jsfuck代码,直接复制该代码,然后再控制台执行,可能会有所收获。
[][(![]+[])[+[]]+([![]]+[][[]]))

实在太多了,绕过也都很难,异或什么的,我记得要跑脚本,考到再专门研究吧。

7、str_replace()

str_replace(a,b,c) 在c中把a替换成b
缺陷是无法迭代 双写绕过即可

本来今天还想看一个JAVA,结果写计划和急着去gym放弃了(其实主要原因是这些函数好绕。。。)

欢迎来访 这是我的小窝~ 网安弱鸡 健身屌丝 好不容易搭出来的 大佬略过我
最后更新于 2025-07-25