大家好,今天来为大家分享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禁止获取网站源码分享的信息别忘了在本站进行查找哦。