php禁止获取网站源码分享,phpstudy403禁止访问

大家好,今天来为大家分享php禁止获取网站源码分享的一些知识点,和phpstudy403禁止访问的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

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

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

其中$pattern为正则表达式

$replacement为替换字符串

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

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

例如执行preg_replace(‘/test/e’,&34;,&34;)

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

2.MD5加密绕过

2.1MD5弱比较绕过

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

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

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

方法一:

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

md5(QNKCDZO)\n0e830400451993494058024219903391

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

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

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

QNKCDZO0e830400451993494058024219903391s878926199a0e545993274517709034328855841020s155964671a0e342768416822451524974117254469s214587387a0e848240448830537924465865611904s214587387a0e848240448830537924465865611904s878926199a0e545993274517709034328855841020s1091221200a0e940624217856561557816327384675

方法二:

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

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

?

2.2MD5强碰撞

if((string)$_POST[&39;]!==(string)$_POST[&39;]&&md5($_POST[&39;])===md5($_POST[&39;])){\ndie(&-*-coding:utf-8-*-\nimportmultiprocessing\nimporthashlib\nimportrandom\nimportstring\nimportsys\nCHARS=string.letters+string.digits\ndefcmp_md5(substr,stop_event,str_len,.start=0,size=20):\nglobalCHARS\nwhilenotstop_event.is_set():\nrnds=&39;.join(random.choice(CHARS)for_inrange(size))\nmd5=hashlib.md5(rnds)\nvalue=md5.hexdigest()\nifvalue[start:start+str_len]==substr:\nprintrnds\nstop_event.set()\n&39;&碰撞双md5\nmd5=hashlib.md5(value)\nifmd5.hexdigest()[start:start+str_len]==substr:\n\tprintrnds+&34;+value+&34;+md5.hexdigest()+&34;\nstop_event.set()\n&39;&39;__main__&34;你要碰撞的字符串&34;0

将产生MD5值为0e开头的字符串。

注:这个脚本我本地尝试好像有问题,具体问题有时间研究一下再补上。

3.MD4绕过(来自强网杯2020)

$_GET[&34;]!=hash(&34;,$_GET[&34;])

例子0e251288019

md4计算后为0e874956163641961271069404332409

参考网上的例子改了一个简易的python爆破脚本,就是效率真的低到离谱

y1ng神还有高级脚本,感兴趣的可以自己去看看2020第四届“强网杯”全国网络安全挑战赛初赛Writeup–颖奇L&Funhash

没研究透的我就不贴了。

importhashlib\nforiinrange(0,10**40):\ni=&39;+str(i)\nmd4=hashlib.new(&39;,i.encode()).hexdigest()\nifmd4[:2]==&39;andmd4[2:].isdigit():\nprint(&39;.format(i,md4))\nbreak\n34;strpos(&39;,&39;)===false&34;Detectedhackingattempt!&39;).phpinfo();//

此时语句变成了assert(&39;&34;)ordie(&34;)

相当于assert(&39;&34;)

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

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

读者可以自行尝试assert(&34;)和assert(&34;)运行起来的区别。

6.反序列化相关知识点

1.__toString()

触发条件时对象被当作字符串调用时就会执行。

需要指出的是在PHP5.2.0之前,__toString()方法只有在直接使用于echo或print时才能生效。PHP5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但不能用于非字符串环境(如使用%d修饰符)。自PHP5.2.0起,如果将一个未定义__toString()方法的对象转换为字符串,会产生E_RECOVERABLE_ERROR级别的错误。

比如stristr函数。(来自强网杯的怨念)

2.__wakeup绕过

该函数会在反序列化时执行。当成员属性数目大于实际数目时可绕过wakeup方法(CVE-2016-7124)

例如:一个对象序列化结果如下

O:6:&34;:1:{s:4:&34;;s:1:&34;;}

如果想要绕过类中的__wakeup函数,只需要将jungle数量对应的1改成2既可。

注:这里的字符串数字比如O:6,写成O:+6也是可以,利用这个可以绕过一些过滤。

3.S和s的区别

依然已上文的序列化字符串举例

O:6:&34;:1:{s:4:&34;;s:1:&34;;}

这里的s表示的是属性的内容是字符串,因为这里的变量属性是public,如果是protected,则需要在属性名前加chr(0)*chr(0)

也就是s:7:&34;,这个是无法打出来的。

通常情况下我们可以这样表示:s:7:&34;,用%00来代替这个chr(0)字符

如果用S的话,就可以这样写:S:7:&34;,简单来说就是在S的模式下,\\+字符的ascii码的16进制表示就可以被识别为字符,这里的s:7:&34;甚至可以直接表示成S:7:&34;,通过这种方法可以绕过很多过滤(来自强网杯的怨念),具体原理可以参考https://www.neatstudio.com/show-161-1.shtml

4.反序列化逃逸

这个好复杂啊,不想写懒狗选择放弃,大家可以百度安恒月赛反序列化逃逸来找例子参考。

https://www.cnblogs.com/BOHB-yunying/p/12774297.html

这个师傅就写的很好,可以参考一下。

7.弱比较问题

7.1数字与字符串的比较

字符串与数字比较的时候,会自动提取字符串中的数字。

例如

1==&34;可以通过

1==&34;可以通过

注:这里从字符串中提取数字的操作是从首位开始,如果首位不是数字就不会提取数字,1==&34;不可以通过。

8.PHP标签的几种写法

1.<?php?>常规写法2.<??>

注:

利用短标签写法可以绕过一些对php字符的过滤Windows环境中短标签默认是打开的,Linux下默认是关闭的。控制参数:php支持短标签,需要我们把short_open_tag设置为On.

3.<%%>

注:需要配置php.ini文件。在配置文件中找到asp_tags=off,将off改为on。改动配置文件后需要重启apache。4.<scriptlanguage=”php”></script>

9.php中的命令执行函数总结

10.disabled_function绕过

11.PHP下的模板注入TWIG

如果目标网站没有对模板进行过滤,即可通过一下方法执行命令。

{{_self.env.registerUndefinedFilterCallback(&34;)}}{{_self.env.getFilter(&34;)}};

12.PHP伪协议

1.filter协议,利用该协议可以读取文件

php://filter/resource=1.php//该情况下php代码会被执行\nphp://filter/read=convert.base64-encode/resource=1.php//通过转义可以避免被执行,直接读取源码\nphp://filter/read=string.rot13/resource=1.php

有几种常见的编码转换参数

string.rot13string.toupperstring.tolowerstring.strip_tags//去除HTML、PHP标记、空字符,php标签里所有东西都会被去除,html只有标签会被去除,里面的文字不会删除。convert.base64-encodeconvert.base64-decodezlib.deflate//压缩zlib.inflate//解压

注:该协议可以嵌套使用,php://filter/resource=test/../1.php或者php://filter/resource=test/1.php,test文件夹不存在的情况下这两种写法下仍然可以读取1.php文件内容。

2.file协议,该文件也是利用来直接读取文件

file:/etc/passwd

13.PHP变量覆盖漏洞

PHP<5.4.0版本下,可能存在该漏洞。

参见大佬的文章,写的很好

PHP变量覆盖漏洞小结[Mi1k7ea]https://www.mi1k7ea.com/2019/06/20/PHP%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96%E6%BC%8F%E6%B4%9E/

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

?

php禁止获取网站源码分享的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于phpstudy403禁止访问、php禁止获取网站源码分享的信息别忘了在本站进行查找哦。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平