返回列表 发帖
shopxp v7.4 SQL注入漏洞
shopxp网上购物系统 v7.4存在Sql注入漏洞。问题文件:xpCatalog_xpDesc.asp,xpCatalog_xpsmall_Desc.asp问题代码:<%
# |  I  e. V1 v+ g: ~7 M' W  J0 o: m
dim shopxpbe_id, anclassname, shopxpse_id, nclassnamedim totalPut dim CurrentPage, TotalPages

$ W7 Z1 k+ F6 J: t7 t
if request("shopxpbe_id")<>"" thenshopxpbe_id=request("shopxpbe_id")elseshopxpbe_id=0end ifif request("shopxpbe_id")="" then shopxpbe_id=1end ifif not isempty(request("page")) thencurrentPage=cint(request("page"))elsecurrentPage=1end if

1 F9 u* h, o' Q+ z/ K6 e0 K
set rs=server.createobject("adodb.recordset")rs.open "select * from shopxp_btype where shopxpbe_id="&amp;shopxpbe_id,conn,1,1anclassname=rs("shopxpbe_name")rs.close%>并没有对shopxpbe_id进行整形判断。下面在说说他的防注入系统。好像是网上的枫叶防注入。看代码吧:Dim Fy_Url,Fy_a,Fy_x,Fy_Cs(),Fy_Cl,Fy_Ts,Fy_ZxFy_Cl = 2 '处理方式:1=提示信息,2=转向页面,3=先提示再转向Fy_Zx = "../" '出错时转向的页面On Error Resume NextFy_Url=Request.ServerVariables("QUERY_STRING")Fy_a=split(Fy_Url,"&amp;")redim Fy_Cs(ubound(Fy_a))On Error Resume Nextfor Fy_x=0 to ubound(Fy_a)Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)NextFor Fy_x=0 to ubound(Fy_Cs)If Fy_Cs(Fy_x)<>"" ThenIf Instr(LCase(Request(Fy_Cs(Fy_x))),"'")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"select")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"update")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"chr")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"delete%20from")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),";")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"insert")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"mid")<>0 Or Instr(LCase(Request(Fy_Cs(Fy_x))),"master.")<>0 ThenSelect Case Fy_Cl省略部分代码
9 i/ b$ r% e; f- j
这个防注入系统在网上貌似很火,但是他防的是有问题的。关键是这句,Fy_Url=Request.ServerVariables("QUERY_STRING"),Request.ServerVariables得到的数据是原样的,并不会进行URL解码。这也就导致可以进行URL编码绕过这个防注入。以下是lake2对这段代码的分析:

( }+ s: Z7 P, @! N- z. f, T: C
“它的思路就是先获得提交的数据,以“&amp;”为分界获得并处理name/value组,然后判断value里是否含有定义的关键字(这里为求简便,我只留下了“and”),有之,则为注射。

6 u  T6 U! a3 S
乍一看去,value被检查了,似乎没有问题。呵呵,是的,value不会有问题,可是,name呢?
% G! K4 c8 g, A- a  h6 B4 X
它的name/value组值来自于Request.ServerVariables("QUERY_STRING"),呵呵,不好意思,这里出问题了。Request.ServerVariables("QUERY_STRING")是得到客户端提交的字符串,这里并不会自动转换url编码,哈哈,如果我们把name进行url编码再提交的话,呵呵,那就可以绕过检查了。比如参数是ph4nt0m=lake2 and lis0,此时程序能够检测到;如果提交%50h4nt0m=lake2 and lis0(对p进行url编码),程序就会去判断%50h4nt0m的值,而%50h4nt0m会被转换为ph4nt0m,所以%50h4nt0m值为空,于是就绕过了检测。

( |  d& n* ]6 U* r" N
等等,为什么既然name不解码可以绕过检查而value就不能绕过呢?因为value的值取自Request(Fy_Cs(Fy_x)),这个服务器就会解码的。

( W* d( P& Z  v/ C% ]
程序怎么改进呢?只要能够得到客户端提交的数据是解码后的就可以了,把得到name的语句改为For Each SubmitName In Request.QueryString就可以了。”
2 _2 Z* m1 N3 D' p: J6 B+ K
下面说下利用:Google:inurl:xpCatalog_xpDesc.asp?action_key_order=biginurl:Catalog_Desc.asp?action_key_order=big (这个貌似是商业版的)构造如下地址:http://www.sitedir.com.cn/xpCatalog_xpDesc.asp?action_key_order=big&amp;shopxpbe_%69d=79 (对i进行URL编码),交给工具 手动添加表名:shopxp_admin 和shop_admin(商业版的)默认后台是 admin_shopxp 或者admin

7 P% w5 l9 L( y1 ^. W# m! Y) Y6 V8 ~. t5 k$ }! {' @

4 q; v% l* l6 `3 I! \
- S; T* P( Z( i1 b. w& A  N$ ^/ u" Q, U+ O, y0 p1 R+ P8 ^% m
7 g; q% J$ N- S

! g& t5 |$ B  N" f- v5 r6 |5 @9 @8 ]& A( d2 \
0 D, ]9 V7 ?" }: [

. d( c1 ?- ]" Y# V
* N) z1 r# z0 d/ m: r
) u8 Y6 y& G: P: y9 n. r1 s9 X' a8 ^) P. s8 ^( D, Q
5 G, f8 @/ x- x% K

9 y- K9 R  e, u4 y3 z! L1 J6 ^4 o3 K6 w3 ~& b! u
2 e7 M1 y9 X5 n7 o7 i
2 a5 V& N* l7 s6 Y* N4 T
( ?$ u3 S5 ]. q. e' @
公告:https://www.sitedirsec.com公布最新漏洞,请关注

 

您可能还想看的主题:

浙江政安信息安全研究中心招贤纳士啦!

启明星辰研发招聘

合优网站管理系统存在SQL注射。。。原创首发~

联想研究院 安全职位

PHP VS ASP

计算机硬件维护知识

TOP

返回列表