PHP花式绕过大全

做了这么长的时间的ctf,现在总结一下自己做过的题,记录一下各种可能会存在绕过的php函数,持续跟新。

各位大佬可以一起交流♂交流。

PHP花式绕过大全_第1张图片

 

1.preg_replace ($pattern ,  $replacement , $subject )

其中  $pattern为正则表达式

         $replacement为替换字符串

         $subject 为要搜索替换的目标字符串或字符串数组

这个函数存在一些奇异的地方,正则表达式$pattern以/e结尾时$replacement的值会被作为php函数执行。

例如执行 preg_replace (‘/test/e’ ,  "phpinfo();" , "test" )

“test”会被替换为phpinfo();并执行。

 

2.MD5加密绕过

php中有一个提供MD5加密的函数md5()通常被用来进行密码验证之类的功能。

在ctf中常见如下的验证方式:

if( a == b && md5(a) == md5(b) )

方法一:

这儿md5(a)/md5(b)两数如果满足科学计数法的形式的话,php会将其当作科学计数法所得的数字来进行比较。例如:

md5(QNKCDZO)
0e830400451993494058024219903391

可以看见QNKCDZO的md5值是0e开头满足科学计数法的表示形式,而0e的值始终为0

因此,只要字符串经md5后满足科学计数法的0e开头,他们在==比较时就会被认定为相等。(只对==比较有效,不适用于===)

以下给出一些满足该要求的md5数

QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
 

方法二 :

 md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的。

也就是说a[]=1,2 b[]=2,3 该验证依然可以绕过。

2.2 MD5强碰撞

if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
        die("success!);
}

Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

 

3.strip_tags()

这个函数用于去除字符串中的 HTML 标签,正常来说确实没啥问题。

但是却在ctf中一些绕过中存在。(出自roarctf2019 simple_upload)

thinkphp原生代码中的upload()上传功能,会对上传的文件名执行该函数。

利用该方法可以进行前端绕过。

当php进行上传文件后缀验证,过滤.php时。

一般情况下诸如 1.php是无法上传上去的,但是此处可以通过 构造文件名为 1.php绕过该验证。

文件上传后不满足.php绕过过滤,但是在tp的原生上传函数被调用是被去除,文件就会被以php格式上传。

注:此处的html可以为任意html标签

 

4.assert()

这个函数是php的断言函数,用来判断一个表达式是否成立。返回true or false。

注:assert执行的字符串包含的php语句如果有多条,只会执行第一条。

该表达式会被当做php函数来执行,相当于eval()

在ctf中该函数也有一定的可利用性,如xctf中的一题

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

$file为用户传入的字符串,这里构造file=').phpinfo();//

此时语句变成了assert("strpos('').phpinfo();// ===false" ) or die (" ")

相当于 assert("strpos('').phpinfo();" )

phpinfo()就被注入进去并执行了。

注:这里用到了php的一个特性,那就是 .连接符 ,

读者可以自行尝试assert("ehco(123);phpinfo();")和assert("ehco(123).phpinfo();")运行起来的区别。

 

 

 

暂时就写到这儿如果后续还有其他说话,会继续更下来,以后如果有时间会写一个php一些伪协议的总结。

 

你可能感兴趣的:(ctf)