在Web程序设计中,处理表单提交的数据是客户端向SERVER传递数据的主要方法,表单数据的提交方法有两种Post方法和Get方法,当使用Post方法时,数据由标准的
' n5 ~1 e. c2 q/ c4 D输入设备读入,当使用Get方法时,数据由CGI变量QUERY_STRING传递给表单数据处理程序,当Post方法一般不会在服务器上留下痕迹。具体的实现过程这里我就不多说,4 N: m t+ K1 B- t
有兴趣的朋友可以去翻阅其他资料。不管是ASP程序还是PHP,CGI程序,表单提交的作用的大同小异的,所以这里仅以ASP为例。
H" r4 Z7 R4 @8 u4 i5 B% i. x
! c3 J# T4 z$ s. N3 C 一.利用表单本地提交突破入侵限制
+ F+ Q( b* r; u3 A+ r* C 既然表单是客户端与服务端的重要数据传递方法之一,那么它的安全性就难免会出现问题。8 r# P% c2 K4 p Q# ~
' [* n6 `% o3 O+ N: V3 ^1:上传非法文件。
' O' _! @: I& {/ ^, I : Q9 k: R$ x" y3 ] p
某同学录的popwindowupload1.asp的客户端代码如下:1 g6 z% D+ Q: B; c. U+ l
0 `% n9 v# P- |4 X2 \ h0 w< HTML> .... < Script language="javascript"> function mysubmit(theform) { if(theform.big.value=="") { alert("请点击浏览按钮,选择您要上传的jpg或gif文件!") theform.big.focus; return (false); } else { str= theform.big.value; strs=str.toLowerCase(); lens=strs.length; extname=strs.substring(lens-4,lens); if(extname!=".jpg" && extname!=".gif") { alert("请选择jpg或gif文件!"); return (false); } } return (true); } < /script> ..... < input type="hidden" name="act" value="upload"> < input type="hidden" name="filepath" value="/alumni/class/classimage"> < input type="submit" name="Submit2" value="开始上传"> .... < /HTML>
! |. `! B! D% O. E
2 e" n" e8 F. d$ a 很明显,这个上传文件在客户端利用SCRIPT限制了上传类型,虽然用SCRIPT可以减轻ASP程序的负载,但象大部分好的方面一样也有它坏的一面,如果其只是在客户端做限制,并在服务端限制上传类型或禁止外部提交,那么它并不能阻止我们上传程序禁止上传的ASP,CER,PHP等文件,只要我们在本地构造一个表单也能能轻松的上传这些文件。
# X4 O5 J6 S" M. e
6 o" X2 L3 b t& m# s 构造的表单主要代码如下:
( @+ m3 S$ v+ E) F2 ` .............
) `& P# N( P' @
+ w) u! x" r8 W' z< form name="mainForm" enctype="multipart/form-data" action="http://www.*** w.com/alumni/class/pic/upfile.asp?userid2=" method=post"> < tr> < td width="74" align="right" height="26">标题: < td width="399">十二少 < /tr> < tr> < td width="74" align="right" height="26">照片说明: < td width="399">十二少's照片 < /td> < /tr> < tr> < td width="74" align="right" height="26">图片路径: < td width="399"> < input type="file" name="big"> < /td> < /tr> < tr align="center"> < td colspan="2" height="26"> < input type="hidden" name="act" value="upload"> < input type="hidden" name="filepath" value="/alumni/class/classimage"> < input type="submit" name="Submit2" value="开始上传"> < br> < /td> < /tr> < tr align="center"> < td colspan="2" height="26" class="di">只支持jpg,gif文件,图片大小在 150k< /font>以内,上传时请耐心等待! < /tr> < /form>
9 q% F0 J( b! y3 u9 ^$ }) M
2 b) O3 g, g9 Z. ~8 X: U: P# F ....
7 p8 n8 H9 s, j& I5 ]- r2 B' [ 只要将前面查看得到的代码中的验证文件类型的SCRIPT删掉,然后再修改ACTION后的URL保存为HTML文件即可7 K& @- @! {7 O) M5 z, W
t+ y) `7 J( @
2:突破表格注入限制7 d2 ~- a( ^+ x- ]1 d# s$ m6 @
这个和前面一差不多就不再多说了(呵呵,其实是找不到实例拉)
7 h) |4 T2 z* U1 j$ F 另外字符输入的长度限制也差不多,只要你看得懂这些HTML语言。9 q( U) E- F h! o# M- a0 i1 I
二.HIDDEN隐藏字段缺陷
7 P/ [: [7 u, h2 l5 N% B$ [9 R0 W 终于说到重点了。
* Y. l( v1 D6 T 1:还是SQL注入问题。* y% Z# b' s0 f1 |1 Z
目前SQL注入工击仍是入侵中的一大热点,不过随着时间的推移,一般的大型网站程序都已经将明显的
( ?" g# U. I/ q8 X; i 注入点打好补丁拉,但是一些隐藏的比较深的注入点却还是有不少的,除非将它所有的代码都翻新一片。
9 {. r9 G0 S) w( {7 S& _ 明显的注入点如:.asp?id=*,输入框等都已经过滤了,但这就能彻底的杜绝黑客的入侵吗?回答当然是NO
' P T7 n0 }7 _# n 这就要提到本文的重点HIDDEN隐藏字段拉。
+ K$ r% E8 d; y7 _. j2 T( k 图1是某网游官方站点的帐号激活界面,查看源码,搜索"HIDDEN"字符串2 t: {/ B1 B/ v0 R4 j
# F* d& z/ n I8 ]& [; }+ a3 n/ X
9 t0 |. ~/ z( F# D$ t< form action="index_game.asp" method="post" name="form1" target="_blank" > ... < td height="25" align="center"> < input type="submit" name="Submit" value="提交"> ... < /form>
9 u% t7 O) J2 j1 B8 e
; Y3 [5 y) d3 M
' N9 ~) F- g9 T+ R 如图2,看到了吗那个:
) @! I2 v: @( g& ~& X& n$ S 只要它没有在客户端做任何限制,/ D1 Z0 K* T( b2 R
这就是一个注入点拉,将"user_name"的值"norfolk"改为想要注入的代码,然后和前面的一样将"ACTION"
, m# u% i* W" y& J, D( Q" P. }6 l( H 的改为相应的URL,保存为HTML文件~~~~~~~~~, o2 z: W7 f e
不过,它的安全还不错,提交后返回错误提示窗口,很显然它在服务端禁止了外部提交。
5 F, t, b0 S5 x# e8 d2:非法修改其他用户密码。
7 `+ P3 J7 g& |. J
0 v$ ~' k$ C' Z; F0 H4 K' n4 C" I; D 典型的代表是leadbbs V2.77的那个密码修改漏洞:任何注册用户都可以修改管理员密码,从而入侵服务器,( B/ ?" @" S+ B
进而拿下主机。
) W6 j& v. A" U5 x0 r 登陆后修改密码,查看源码,其主要漏洞代码如下:
/ `. ^% x7 R5 K' C+ Z% F% v2 G3 r. }.......
4 Z' H) G; @2 C2 z5 c) Q7 P8 l4 S% G' \$ x% k
2 ?" [0 B G1 q# l4 g< form action=usermodify.asp method=post name=form1 > < tr> < td align=middle height=25> < p>*用户名称: < td height=25> < p>norfolk < tr> < td align=middle height=25> < p>*你的密码: < td height=25> < input class=fminpt name=submitflag type=hidden value=52norflk> < input class=fminpt name=form_id type=hidden value=265>
) v" B" T! n2 h* n% c% [: I, l& Y- G& a
/ k2 a, f0 O2 j* Q# V
........
5 k8 R7 s) X; C3 f7 [' j. g7 u! W' T4 U7 P
其中我的from_id的值为265,在管理员例表中查看管理员ID,然后将它替换265,再将ACTION的URL相应的修改一下: y( p5 l1 y8 p# ~
保存为HTML文件再提交就可以将管理员的密码改成52norfolk。
4 Z+ `# X- t8 d
( v3 L! J( N( X- B 这个漏洞早在2003.12月就已经公布,这里在拿出来只是为了说明一下这个HIDDEN隐藏字段的危害。不过我发现目前( C; e3 t1 b- |, u6 S9 K
还是有不少程序可以任意修改其他用户的密码,至于方法如出一辙,(偶用这个漏洞拿下过不少站点的ADMIN):-_-& W: H( C. y9 W# Q
4 A% {( G& B$ G8 E3:任意修改价格以达到低价甚至不花一分钱网上购物。
2 H8 w7 h" Z! t) j1 Y * a R o' e4 |: a/ S4 J1 A$ c% W
早在几年前国内国外的一些大型网上购物网站就已经出现过类似的漏洞。 这些网站的后台程序的验证机制并不健全
7 N1 X. h: w0 [4 t1 {5 D2 q以至可以在外部提交数据,于是便出现了低价甚至不花一分钱购买商品的事件,导致这些网站造成重大的经济损失," p( }4 O+ g( D4 i& b
由此观之,网络安全是马虎不得的,即使一丁点而问题,造成的损失也是不可估量的。希望之后的程序员在编写程序时能
: M* S: K$ P# s5 e; _ 够尽量细心。这里我就不再将它的利用过程写出来了,反正它们的利用过程都基本相似。0 ^: Q' x: J; b7 [8 L+ A
2 G9 j7 E5 T0 ?7 x
最后给大家介绍老外写的一个不错的检测WEB应用程序安全性的工具,一下是安全焦点的介绍:. [ |+ z( C" ^
2 N( w% B5 e) R+ ]4 J
Achilles是一个设计用来测试web应用程序安全性的工具。它是一个代理服务器,在一
- z/ E5 K2 G/ V, V% c9 a 个HTTP会话中扮演着"中间人"(man-in-the-middle)的角色。一个典型的HTTP代理服% k# W% v+ G( {% c4 `
务器将在客户浏览器和web服务器间转发数据包,但Achilles却载取发向任一方的HTTP会6 H4 R \2 i' ?6 y3 z* H
话数据,并且在转发数据前可以让用户修改这些数据.
, U; n7 t7 u/ w( w
( `: A6 @$ p8 e( Y 相信在WEB入侵方面可以为您提供不少的帮助,如果有可能下次再专门写篇文章介绍它吧,这里我就不多说了,有兴趣的2 c) E3 m+ f* d& @$ W5 c7 L
朋友可以自己下载研究研究,它的下载地址:http://www.xfocus.net/tools/200403/achilles-0-27.zip' l/ c; K( D: f1 R. U! H- t3 J+ v
5 ~( }0 g) ~' a0 t8 u
) S1 R% k# v+ l 后记: O" ?) C0 D: _+ |
到这里还是说一下解决方法吧。4 H: O% `/ Y5 ^
首先当然是禁止外部提交,这里有种不错的方法,大家可以参考参考:
' @8 N( M2 E* ], z* ]/ r
) U8 k0 r( ]) n8 F N1 p! `* Y, S2 ~7 E* P1 v
< % server_v1=Cstr(Request.ServerVariables("HTTP_REFERER")) server_v2=Cstr(Request.ServerVariables("SERVER_NAME")) if mid(server_v1,8,len(server_v2))<>server_v2 then % > 你想入侵我也不要这么麻烦嘛,直接打电话告诉我,我给你开WEBSHELL,呵呵 < % Response.Redirect "Fuck-Hacker.asp" end if % >' C+ N' \/ {4 U: X: v
- F5 ^' E% N: j( c% d* E( z" E3 R( Y: H: O" R) A
但这不能彻底杜绝黑客对传递的DIDDEN数据的修改,前面那个ACHILLES就能修改,所以在服务端还要有健全的验证机制。 |