《跟我一起学“网络安全”》——渗透测试

渗透测试

一、渗透测试基础名词

  1. 前后端
    前端:网页制作(用户可以友好访问)
    后端:设计数据结构与数据库(不允许用户访问)
  2. POC-概念验证
    全称“proof of concept”,概念验证,目的是验证一个漏洞是否真实存在,而不是用来实现完整的攻击
  3. EXP-利用
    全称“Exploit”,利用,指的是利用系统漏洞进行攻击的动作,通常包含了一系列的攻击动作
  4. Payload-有效荷载
    有效荷载,指的是EXP成功之后,真正在目标系统执行的代码或指令
  5. Shellcode
    简而言之,Shellcode是用于漏洞利用的二进制代码
    注意: Shellcode不是Shell脚本,而是二进制代码
  6. POC、EXP、Payload、Shellcode的整体理解
    POC就像是一个简单的证据,它告诉我们“看,这个锁可以被撬开”,但它并不会真的去撬锁。EXP(利用代码)则是一把专门制作的撬棍,不仅证明锁可以被撬开,还真的去撬了锁。Payload是撬棍里面的机关,一旦撬开锁,它决定了要做什么,比如打开一个通往外面世界的小窗户(反向Shell)。Shellcode是这个小窗户的开关代码,它是一串特制的指令,用来控制被撬开的系统做我们想让它做的事
  7. 后门
    指入侵者在利用某些方法成功控制主机之后,可以在对方的系统之中植入特定的程序,或者修改某些设置,用于查看、访问和控制这台主机
  8. Webshell
    Webshell通常以网页文件(如:ASP、PHP、JSP)的形式存在,攻击者通过各种漏洞将其上传至服务器,然后可以通过浏览器访问这些脚本来执行服务器命令
  9. 木马
    是一种恶意软件,它通常隐藏在看似合法的程序中,或者通过诱导用户执行看似无害的文件来传播
  10. 病毒
    它是一种恶意软件,它用来感染计算机系统,自我复制,并在不同计算机之间传播
  11. 反弹
    将权限交给其他机器,并由其他机器进行控制
  12. 跳板机
    一个具有辅助作用的机器,利用这个主机作为一个间接服务器,来入侵其他主机,一般与肉鸡一起使用
  13. 堡垒机
    堡垒机在跳板机的基础上增加了更多的安全和管理功能。除了远程登录之外,堡垒机还提供用户认证、权限认证、会话审计、运维流程控制和统一管理等功能
  14. 肉鸡
    被黑客控制的计算机,也可以作为跳板机使用
  15. VPN
    VPN的主要用途是建立安全的远程访问连接,而不是限制用户访问权限或提供安全控制节点,建立访问隧道
  16. 暴力破解
    简称“爆破”,对系统中账号的每一个可能进行枚举验证,从而获得系统的访问权限
  17. 社会工程学
    利用人的社会学弱点实施的一整套方法论,攻击方法往往出人意料,例如:社工库、钓鱼
  18. 撞库
    攻击者通过收集互联网上已泄露的用户名和密码信息,生成对应的字典表,然后尝试批量登录其他网站,以此获取可以登录的账号和密码组合,MD5解密
  19. ATT&CK
    ATT&CK是由MITRE公司开发的一个知识库(对抗战战术、技术和常识)
  20. 测试分类
    白盒测试: 完全开放测试目标内部逻辑结构相关信息,可根据目标信息选择测试方案,类似于代码审计
    黑盒测试: 完全不了解测试目标的内部机构和特性,客户不提供目标相关信息,例如:只知道目标网站的域名
    灰盒测试: 介于二者之间

二、渗透测试流程

  1. 什么是渗透测试
    渗透测试 (penetration test):是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种方式。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析,这个分析是从一个攻击者可能存在的位置来进行的,并且从这个位置有条件主动利用安全漏洞。
    特点: 是一个渐进的并且逐步深入的过程;使用不影响业务系统正常运行的攻击方法进行的测试。

  2. 渗透测试流程

  • 官方过程
    渗透测试流程①.明确目标
    确定范围: 测试目标的范围、ip、域名、内外网、测试账户。
    确定规则: 能渗透到什么程度,所需要的时间、能否修改上传、能否提权、等等。
    确定需求: web应用漏洞、业务逻辑漏洞、人员权限管理漏洞、等等。
    ②.信息收集
    方式: 主动扫描,开放搜索等。
    开放搜索: 利用搜索引擎获得:后台、未授权页面、敏感url、等等。
    基础信息: IP、网段、域名、端口。
    应用信息: 各端口的应用。例如web应用、邮件应用、等等。
    系统信息: 操作系统版本
    版本信息: 所有这些探测到的东西的版本。
    服务信息: 中间件的各类信息,插件信息。
    人员信息: 域名注册人员信息,web应用中发帖人的id,管理员姓名等。
    防护信息: 试着看能否探测到防护设备。
    ③.漏洞探测
    利用上一步中列出的各种系统,应用等使用相应的漏洞。
    方法:
    (1) 漏扫,awvs,IBM appscan、Nessus等。
    (2) 结合漏洞去exploit-db等位置找利用。
    (3) 在语雀团队知识库或网上寻找验证poc。GitHub
    内容:
    系统漏洞:系统没有及时打补丁
    WebSever漏洞:WebSever配置问题
    Web应用漏洞:Web应用开发问题
    其它端口服务漏洞:各种21/8080(st2)/7001/22/3389
    通信安全:明文传输,token在cookie中传送等。
    ④.漏洞验证
    将上一步中发现的有可能可以成功利用的全部漏洞都验证一遍。结合实际情况,搭建模拟环境进行试验。成功后再应用于目标中。
    自动化验证: 结合自动化扫描工具提供的结果
    手工验证: 根据公开资源进行验证
    试验验证: 自己搭建模拟环境进行验证
    登录猜解: 有试猜解一下登录口的账号密码等信息
    业务漏洞验证: 如发现业务时可以尝漏洞,要进行验证
    公开资源的利用:

exploit-db/wooyun/
google hacking
渗透代码网站
通用、缺省口令
厂商的漏洞警告等等

        ⑤.信息分析
为下一步实施渗透做准备。
精准打击: 准备好上一步探测到的漏洞的exp,用来精准打击
绕过防御机制: 是否有防火墙等设备,如何绕过
定制攻击路径: 最佳工具路径,根据薄弱入口,高内网权限位置,最终目标
绕过检测机制: 是否有检测机制,流量监控,杀毒软件,恶意代码检测等(免杀)
攻击代码: 经过试验得来的代码,包括不限于xss代码,sql注入语句等
        ⑥.获取所需
实施攻击: 根据前几步的结果,进行攻击
获取内部信息: 基础设施(网络连接,vpn,路由,拓扑等)
进一步渗透: 内网入侵,敏感目标
持续性存在: 一般我们对客户做渗透不需要。rookit,后门,添加管理账号,驻扎手法等
清理痕迹: 清理相关日志(访问,操作),上传文件等
        ⑦.信息整理
整理渗透工具: 整理渗透过程中用到的代码,poc,exp等
整理收集信息: 整理渗透过程中收集到的一切信息
整理漏洞信息: 整理渗透过程中遇到的各种漏洞,各种脆弱位置信息
        ⑧.形成报告
按需整理: 按照之前第一步跟客户确定好的范围,需求来整理资料,并将资料形成报告
补充介绍: 要对漏洞成因,验证过程和带来危害进行分析
修补建议: 当然要对所有产生的问题提出合理高效安全的解决办法

  • 我的理解
    渗透测试流程

三、信息收集

  1. 信息收集的概念
    信息收集(Information Gathering): 信息收集是指通过各种方式获取所需要的信息。信息收集是信息得以利用的第一步,也是关键的一步。
    信息收集的意义: 信息收集对于渗透测试来说是非常重要的,我们手上掌握的目标的信息越多,成功渗透的概率就越大。
    信息收集分类:根据流量是否流经目标主机、是否可能会被目标主机发现,分为主动信息收集被动信息收集。
  2. 主动信息收集
    主动信息收集: 通过直接访问、扫描网站,直接与目标系统或者主机进行交互通信,以达到收集信息的目的。
    主动信息收集的优缺点
    优点:
    ①.信息的针对性强
    ②.信息的准确度和时效性高
    ③.能收集到未公开的敏感信息
    缺点:
    ①.无法避免留下访问的痕迹
    ②.收集的信息量和覆盖面比较少

1
2
3
4

5

6
7
8

  1. 被动信息收集
    被动信息收集: 利用第三方的服务对目标进行访问了解,比如:Google搜索、Shodan搜索、fofa搜索等
    被动信息收集目的: 在不被目标主机发现的情况下,对目标进行被动信息收集
    被动信息收集的优缺点
    优点:
    ①.隐蔽性高,不容易被发现
    ②.收集的信息量和覆盖面比较大
    缺点:
    ①.收集到的信息中时效性和准确性不高
    ②.无法收集到敏感或者未公开的信息
    12
    3
    4
    5
    6
    7
    8
  2. 针对人的信息收集
    通过社交平台进行收集:
    微信、QQ、微博、游戏、抖音、快手、网易云音乐等
    Google语法:(知道人的姓名的一些公开信息反查查询其他信息)
    通过对此人所在学校、公司、单位进行信息查询
    通过了解个人习惯,来获得更多信息
    社工方式:
    钓鱼链接
    钓鱼文件
    社工库撞库

四、Nmap的基础命令

哈喽哈喽,大家还记得在Linux篇中,安装的kali系统嘛,Nmap的基础命令,就是在kali系统上执行的哦

  1. 端口扫描
# 指定端口
nmap ip地址 -p 端口号
nmap ip地址 -p 1-指定端口
nmap ip地址 -p 端口号,端口号,端口号
# 全端口
nmap ip地址 -p 1-65535
# 全端口
nmap ip地址 -p- 

#指定扫描方式
# TCP全连接扫描
nmap ip地址 -sT
# SYN半连接扫描
nmap ip地址 -sS
# Fin扫描
nmap ip地址 -sF
# Null扫描
nmap ip地址 -sN
# Xmas扫描
nmap ip地址 -sX
  1. 主机探测
nmap 子网掩码 -sP
  1. 服务识别
nmap ip地址 -sV
  1. 系统识别
nmap ip地址 -O
  1. 结果导出
# 文本格式
nmap ip地址 -oN
# xml格式
nmap ip地址 -oX

五、XSS跨站脚本漏洞

  1. 什么是XSS
    跨站脚本攻击(Cross Site Scripting), 为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为xss。xss是一种web应用程序的安全漏洞,主要是由于web应用程序对用户的输入过滤不足而产生的。 恶意攻击者往web页面里插入恶意脚本代码,当用户浏览该页之时,嵌入其中web里面的脚本代码会被执行,攻击者便可对受害用户采取Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。
    成因:
    ①.对于用户输入没有严格控制而直接输出到页面
    ②.对非预期输入的信任
    XSS

  2. XSS危害简单概括
    ①.网络钓鱼,包括盗取各类用户账号
    ②.窃取用户cookie资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作
    ③.劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账,强制发表日志,发送电子邮件等
    ④.强制弹出广告页面,刷流量等
    ⑤.网页挂马,提升用户权限,包括进一步渗透网站
    ⑥.进行恶意操作,例如任意篡改页面信息,删除文章等
    ⑦.进行大量的客户端攻击,如DDOS攻击
    ⑧.获取客户端信息,例如用户的浏览历史,真实ip,开放端口等
    ⑨.控制受害者机器向其他网站发起攻击
    ⑩.结合其他漏洞进一步扩大攻击,传播XSS跨站脚本蠕虫等

  3. XSS的分类
    XSS分类:反射性XSS,非持久化;存储型XSS,持久化;DOM型XSS:不经过后端
    反射型XSS
    定义: 反射型XSS也称作非持久型、参数型XSS,最常见且使用最广,主要用于将恶意脚本附加到URL地址的参数中,此类型的XSS常出现在网站的搜索栏、用户登入口等地方,常用来窃取客户端cookie或进行钓鱼欺骗。
    特点: 单击链接时触发,只执行一次。
    利用方法: 攻击者利用特定手法(Email、站内私信等),诱使用户去访问一个包含恶意代码的URL,当受害者单击这些专门设计的链接的时候,恶意Js代码会直接在受害者主机上的浏吃器执行。
    反射型XSS
    存储型XSS
    定义: 攻击者直接将恶意JS代码上传或者存储到漏洞服务器中,当其他用户浏览该页面时,站点即从数据库中读取恶意用户存入的非法数据,即可在受害者浏览器上来执行恶意代码﹔持久型XSS常出现在网站的留言板、评论、博客日志等交互处。
    特点: 不需要用户单击特定URL便可执行跨站脚本。
    利用方法: 直接向服务器中存储恶意代码,用户访问此页面即中招。XSS蠕虫。
    存储型XSSDOM型XSS
    定义: DOM-Based XSS是基于DOM文档对象模型的一种漏洞,攻击者通过操纵DOM中的一些对象,例如URL、location等。在客户端输入的数据中包含一些恶意的 JavaScript 代码,而如果这些脚本没经过适当的过滤和消毒,那么应用程序就可能受到基于DOM的XSS攻击。
    特点: Dom-xss取决于输出位置,并不取决于输出环境,因此dom-xss既有可能是反射型的,也有可能是存储型的。
    DOM的规定
    ①.整个文档是一个文档节点
    ②.每个HTML标签是一个元素节点
    ③.包含在HTML元素中的文本是文本节点
    ④.每一个HTML属性是一个属性节点
    ⑤.节点与节点之间都有等级关系
    DOM

  4. 检测XSS漏洞
    手工检测
    使用手工检测WEB应用程序是否存在XSS漏洞时,最重要的是考虑哪里有输入、输入的数据在什么地方输出。
    ①.可得知输出的位置
    输入一些敏感字符,例如”、’、<、>、(、)等
    提交请求后查看HTML源代码,看这些输入的字符是否被转义。
    ②.无法得知输出位置
    很多WEB应用程序源代码是不对外公开的,这时在测试XSS时就有可能无法得知输入数据到底在哪里显示。比如,测试留言本,留言之后要经过审核才显示,这时候就无法得知输入的数据在后台管理页面是何种状态。
    通常可以采用””/>XSS来测试。
    ③.可插入的地方
    用户输入作为script标签内容
    用户输入作为HTML注释内容
    用户输入作为HTML标签的属性名
    用户输入作为HTML标签的属性值
    用户输入作为HTML标签的名字
    直接插入到CSS里
    最重要的是,千万不要引入任何不可信的第三方JavaScript到页面里!
    工具检测
    漏洞扫描工具:洞鉴、AWVS、APPSCAN、XSStrike等
    插件: XSSDetect、XSS Me等

    Web2.0时代,交互性越来越多,ajax使用率也越来越高,xss也越来越多。仅仅通过工具扫描是不可行的。
    大部分工具的原理都是在web页面的源代码进行简单的对比。但是现在js动态生成的dom越来越多,仅仅通过简单的源代码对比是不可行的.
    注意:存储型XSS也好,反射型XSS也罢。xss的本质问题就是让对方浏览器执行你插入的JavaScript!

  5. 漏洞利用
    ①.窃取cookie
    document.cookie可以获取到cookie信息
    ②.XSS盲打
    攻击者最初是看不见后台是什么样子的!故而叫盲打!
    方法:不管3721,见到框框就输入代码!
    XSS盲打

  6. 漏洞防御
    XSS防御的总体思路是: 对用户的输入(和URL参数)进行过滤,对输出进行html编码。也就是对用户提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。
    对输入的内容进行过滤,可以分为黑名单过滤白名单过滤
    黑名单过滤虽然可以拦截大部分的XSS攻击,但是还是存在被绕过的风险。
    白名单过滤虽然可以基本杜绝XSS攻击,但是真实环境中一般是不能进行如此严格的白名单过滤的。
    对输出进行html编码,就是通过函数,将用户的输入的数据进行html编码,使其不能作为脚本运行。

  7. XSS靶场演练
    小皮靶场

  • 反射性XSS(get)
    进入后,我们在这里随便输入内容,点击提交看看结果
    12可见当我们点击提交后,下方会给我响应一段话。
    接着,我们打开开发者工具(F12),或者查看页面源代码,看看
    3可以看到,这个输入框,限制了最大长度20,也就是说在这个输入框里,我们只能输入20个字符,在《跟我一起学“网络安全”》——编程基础的这篇文章里,我给大家介绍了,html是静态语言,因此,我们把它的长度改大一点。输入
 <script>alert(document.cookie)</script>

45成功获取cookie。

  • 反射型XSS(Post)
    在这里我们先输入admin,123456,点击登录
    1然后和之前一样,分析输入框,看看输入框是否有限制,接着输入
<script>alert(document.cookie)</script>

23成功获取cookie。

  • 存储型XSS
    同理,和上述分析一样,
    1
    2
  • DOM型XSS
    1这次,当我们和之前一样,输入相同的js脚本后,发现不行了,这时候,我们可以打开开发者工具(F12),然后在输入框中随便输入,看看浏览器的回显是什么
    2
    此时,我们看到,这次我们输入的内容在a标签里了,这个时候,我们可以换个思路
javascript:alert(document.cookie)

3输入完后,点击提交,然后点击下面的蓝色链接即可。

  • DOM型XSS-X
    这一次,当我们输入完“1”后,啥也没有。
    1这时,我们点击第一个链接发现,会出现第二个链接,然后我们打开开发者工具,可以看到
    2我们发现,其实这一关和前一关,本质是一样的,只不过这次,它多了一层“包装”而已。接着,分析出来问题所在,接着用上一关的代码
javascript:alert(document.cookie)

3拿捏~

  • XSS之盲打
    这一次,我们发现,输入后的内容,没有回显,这个就是盲打,就是 我们也不知道,我们输入的js代码,有没有执行。
    尝试输入最早我们输入的代码
<script>alert(document.cookie)</script>

1这个时候,我们就只能等待被攻击者,看看他是否会上钩了,点击**“点一下提示”**,我们去模拟受害者访问后台。
输入账号:admin;密码:1234562成功~
当然,如果我们输入合法的值,在进入后台后,显示的就是正常数据
3

  • XSS之过滤
    这一关,我们发现,当我们用
<script>alert(document.cookie)</script>

之后
1
我们的输入会被过滤掉,这个时候怎么办呢,之前,我给大家介绍过,html不仅是静态的文件,而且是不区分大小写的。因此,我们可以利用这一特性,去尝试获取它的cookie。

<ScriPt>alert(document.cookie)</sCrIpt>

2ok,拿下~

  • XSS之htmlspecialchars
    和前面一样,我们先试探性的输入,然后查看回显位置,发现在a标签的href属性里面,这个时候,我们就用
javascript:alert(document.cookie)

1拿下,但是还是要给大家解释一下htmlspecialchars()函数的作用:
htmlspecialchars()函数的作用是将特殊字符转换为HTML实体。这些特殊字符包括HTML标签的特殊字符(例如<、>)、双引号、单引号、&符号等。转换后的HTML实体将被浏览器正确地显示,而不会被解释为HTML标签或其他特殊字符,这样可以有效地防止跨站脚本攻击(XSS)等安全问题。

  • XSS之href输出
    这关和上面一样,直接看回显位置,然后梭哈就好
    1
  • XSS之js输出
    这一关,就是皮卡丘XSS靶场里的大boss了,我们尝试了之前所有的方法,发现都没有效果,用F12查看回显发现什么也没有,束手无策了~~~,但是不要着急,这个时候,我们可以用鼠标右键,“查看页面源代码”,
    1我们看到,我输入的“121212”,在js里,并且赋值给了$ms这个变量,此时,我们可以这样做
';alert(document.cookie);//

这个代码分为三个部分去理解,第一部分是

';

它是把前面$ms变量赋值为空字符串

$ms = '';

紧接着是alert(document.cookie);就是获取cookie信息

alert(document.cookie);

最后一个部分,就是注释掉没有用的后面部分

//

注意:因为js代码是以“;”作为语句结束的,所以多条语句可以写在一行,因此会执行成功。
2至此,皮卡丘靶场的XSS部分我们就打完了,但并不是意味着XSS就很简单,以上仅仅只是入门的了解,接下来我们进入另外一个靶场,DVWA靶场,接着看看XSS漏洞的其它打法。
进入DVWA后,我们先设置一下难度,难度分为low(低)、medium(中等)、high(高)、impossible(不可能),其中不可能是打不了的,它向开发者提供了预防XSS攻击的实例。12
接下来,我们就按照这个顺序来打

  • 首先是低级
    这次不是输入框了,而是选择框,我们尝试随便选择一个选项,然后提交。
    3所以,就和以前一样楼,输入
<script>alert(document.cookie)</script>

4拿下~
接下来是反射型的XSS,这次有输入框,我们接着试试刚才的方法,拿捏~~~
5最后是存储型的XSS
还是刚才的方法,但是我们发现,Name输入框,有限制长度,我们打开F12,修改长度即可,因为是low难度,所以还是刚才的方法即可
6

  • 接下来是中等难度
    到了中等难度,DOM型的XSS里,上述方法不行了,这个时候怎么办呢?之前我们发现,它是get请求,就是可以在url里携带参数,于是,我们可以这样进行攻击,我们在后面再给它一个参数,拿下
&dzs=<script>alert(document.cookie)</script>

7到了反射型XSS里,我们输入低级的打法时,发现script标签被替换了,并且回显位置在pre标签里
8这个时候怎么办呢?我们可以尝试一下使用大小写一起写script标签,并且把pre标签匹配掉。小儿科!!!

</pre><SCript>alert(document.cookie)</scriPT><pre>

9然后是存储型XSS,依旧是把name的长度改大,然后把script标签大小写混写即可,小儿科~

<SCript>alert(document.cookie)</scriPT>

10

  • 最后是高级
    还是一样,输入初级和中等的代码后,发现没有效果了,这时候,怎么办呢,我们可以尝试以下这样
English#<script>alert(document.cookie)</script>

11拿捏,但是为什么可以呢?**URL 中的哈希符号 (#) 被用来作为网页中的 锚点 使用,锚点的含义就是页面中的某个特定的位置,这个位置可以被快速找到,很类似于在该位置抛了一个锚。**当我们输入上述代码后,浏览器会把alert(document.cookie)放到页面的script标签里,因此就会获取到cookie的值。
然后是反射型XSS
这个时候,我们在输入初级和中级的方法后,发现都不行了,这个时候,我们就可以猜测,前端把大小写的script标签过滤了,此时,我们可以尝试换一个标签,比如,这里我选择使用img标签

<img src=1 onerror=alert(document.cookie) />

src故意写一个错误的值,然后使用onerror错误事件,但图片加载错误时触发,此时,就可以啦~~~
12最后就是存储型XSS
还是一样的套路,使用其他标签绕过即可(别忘了修改name的长度),这里依旧是

<img src=1 onerror=alert(document.cookie) />

13

  • 小结
    XSS攻击分为反射型、存储型和DOM型,在进行XSS攻击的时候,不要死记硬背,而是学会分析输出的回显,以及灵活的运行html或js的相关的特性,常见的一些套路也给大家总结了十条常见的套路:
    ①. 直接写script标签
    ②. 大小写混写
    ③. 构造标签闭合,写script标签
    ④. 构造标签闭合,写img标签
    ⑤. 构造标签闭合,写a标签
    ⑥ 构造标签闭合, 用onclick事件
    ⑦. 双写绕过
    ⑧. 实体字符编码
    ⑨. 实体字符编码 + // http://
    ⑩. 使用请求头参数Referrer、User-Agent、cookie来进行写入

六、SQL注入

  1. SQL注入概述
  • 什么是SQL注入
    所谓SQL注入,就是恶意用户把SQL命令插到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。简单来说,就是数据“越俎代庖”做了代码才能干的事情。 这个问题的来源是,SQL 数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说 SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。
  • SQL注入的原理
    当Web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
    第二个很重要的原因就是我们开发人员水平参差不齐,没有进行一些敏感字符过滤,导致漏洞产生。
  • SQL注入漏洞的本质
    把用户输入的数据当做代码来执行,违背了“数据与代码分离”的原则。
  • SQL注入漏洞有两个关键条件
    ①.用户能控制输入的内容;
    ②.Web应用把用户输入的内容带入到数据库中执行;
  • SQL注入漏洞的危害
    脱库/getshell
  • SQL注入的地位
    SQL注入的地位
  • SQL注入的主要特点
    ①.广泛性:任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、Cookie等接收到的值进行规范性验证和检测,通常会出现SQL注入漏洞。
    ②.隐蔽性:SQL注入语句一般都嵌入在普通的HTTP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以告警,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果不理想。
    ③.危害大:攻击者可以通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也有很大的影响。
    ④.操作方便:互联网上有很多SQL注入工具,简单易学、攻击过程简单,不需要专业的知识也可以自如运用。
  • SQL注入危害
    ①.攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。
    ②.可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。
    ③.如果网站目录存在写入权限,可以写入网页木马。攻击者进而可以对网页进行篡改,发布一些违法信息等。
    ④.经过提权等步骤,服务器最高权限被攻击者获取。攻击者可以远程控制服务器,安装后门,得以修改或控制操作系统。
  1. SQL注入攻击
  • 根据sql注入点的参数类型分类
    整数型注入:
    在Web端大概是http://xxxx.com/news.php?id=1这种形式,其注入点id类型为数字,所以叫数字型注入点。这一类的SQL语句原型大概为select * from 表名 where id=1。组合出来的sql注入语句为:select * from news where id=1 and 1=1
    字符型注入:
    在Web端大概是http;//xxx.com/news.php?name=admin这种形式,其注入点name类型为字符类型,所以叫字符型注入点。这一类的SQL语句原型大概为select * from 表名 where name=’admin’。注意多了引号。组合出来的sql注入语句为:select * from news where chr=’admin’and 1=1
    闭合单引号chr=’admin’ union select 1,2,3,4 and ‘1’=’1 ==> chr=’admin’(闭合前面单引号)union select 1,2,3,4 and ‘1’=’1’
    搜索型注入:
    这是一类特殊的注入类型,这类注入主要是指在进行数据所搜时没过滤搜索参数,一般在连接地址中有”keyword=关键字”,有的不显示在的链接地址里面,而是直接通过所搜框表单提交。此类注入点提交的sql语句,其原形大致为:select * from 表名 where 字段 like ’%关键字‘。组合出来的sql注入语句为:select * from news where search like ’%测试%‘ and ‘%1%’=’%1%’测试%’ union select 1,2,3,4 and ‘%’=’
  • 根据请求方式不同分类
    GET方式请求注入:
    提交数据的方式是GET,注入点的位置在GET参数部分。比如有这样的一个连接 http://xxx.com/news.php?id=1,id是注入点。
    POST方式请求注入:
    使用POST方式提交数据,注入点位置在POST数据部分,常发生在表单中。
    Cookie注入:
    http请求的时候会带上客户端的Cookie,注入点存在Cookie当中的某个字段中。
    http头部注入:
    注入点在http请求头部的某个字段中,比如存在User-Agent字段中。严格讲的话,CooKie其实应该也是算头部注入的一种形式。因为在http请求的时候Cookie是头部的一个字段。
  • 根据sql注入点的反馈类型分类
    ①.基于错误显示的sql注入--------->报错注入
    ②.union类型的sql注入-------------->联合查询注入
    ③.布尔类型的sql注入--------------->布尔注入
    ④.基于时间的sql注入--------------->延时注入
  • 根据web应用常用的数据库类型分类
    ①.Mysql数据库注入
    ②.SQLServer数据库注入
    ③.Oracle数据库注入
    ④.Access数据库注入
  1. 易发生sQL注入漏洞的位置
    任何用户输入与数据库交互的地方都可能产生注入! 比如:登录框、搜索框、url参数值(get)、url参数值(post)、消息设置
  2. 判断注入漏洞的依据
    根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行,如果测试语句被执行了,说明存在注入漏洞。
    判断注入漏洞的依据
  3. 皮卡丘靶场
  • 数字型注入
    1进入靶场后,我们选择“1”以后,页面回显编号为1的信息,我们要怎么注入呢?这个时候,我们可以用抓包工具,我使用的Burp,
    1
    写入
    2
and 1=1 --+

查看回显,发现,依旧可以查询成功
说明这里是注入位置,我们可以通过 order by 数字,来判断这个查询语句里查询了多少列

order by 1 --+

34
5
发现1,2没有报错,但是3的时候,报错了,说明,我们要注入的语句它查询了两列,这个时候,我们可以使用联合查询(union),进行我们的操作了。
注意:以下语句中,1没有任何意义,就是为了占位而已,可以是任何数字。

# 查当前数据库
union select 1,database()
# 查当前用户 
union select 1,user()
# 查数据库版本 
union select 1,version()
# 查当前数据库的表 
union select 1,table_name from information_schema.tables where table_schema=database()
# 查当前数据库的对应的表的字段名 
union select 1,column_name from information_schema.columns where table_schema=database() and table_name='users'
# 查用户名和密码数据 
union select username,password from users

678910
11至此,我们就ok了,在获取到数据库的账户信息后,我们可以看出,这里的密码是MD5加密的,可以利用撞库,将其破解。这样,这关就轻松拿捏了~~~
但是别被这点喜悦重婚头脑,事实上,我们可以从上面的流程中,总结出来SQL注入的步骤:
①.判断注入点
②.判断列数
③.查当前数据库
④.查当前用户
⑤.查数据库版本
⑥.查当前数据库的表
⑦.查当前数据库的对应的表的字段名
⑧.查用户名和密码数据

后面的关卡里,我们都是根据这个步骤来打的,只是在具体的SQL语句上,会有略微区别。

  • 字符型注入
    再打这关前,我们先下载一个插件HackBar
    12下载好后,我们就来打这关,打这关的时候,因为前面的语句都相同,我就不重复写了,只是注意,这里是字符串型,因此我们需要去闭合SQL语句里的’'或""。
    因此,SQL在查找注入点的时候,就变成了
# 这里要把'闭合掉
vince' and 1=1 --+

3然后就是一样的了(注意这里跳过了查看数据库、数据表、以及字段的过程)

vince' union select username,password from users --+

4小儿科~~~拿捏

  • 搜索型注入
    这一关我们看提示发现是模糊查询,并且查询列是3列,我们用1占位,其他的都一样,因此,
vin' union select username,password,1 from users --+

1拿捏~~

  • xx型注入
    这一关,我们查看提示,它让我们闭合就好,但是我们不是把引号闭合了嘛?还有什么是没闭合的呢?其实,这里是SQL语句的一个特性,就是我们通常在写where条件的时候,直接用引号把字符串包裹了,但其实也可以通过(‘’)或(“”)这样来包裹,因此,大家懂了吧~~
    1
vince') union select username,password from users --+

2依旧拿捏~~~

  • “insert/update”注入
    进入这关,我们首先看看提示,它让我们去注册一个账号
    1
    这个和之前的都不太一样了,我们还是用Burp进行抓包,在表单里全部输入1。此时我们可以看到
    2
    这个时候,我们该怎么做呢?
    我们可以去模拟的注册的语句
insert into 表名 values('1','1','1','1','1','1');

那么,此时我们就需要用到“报错注入了”,因为在insert/update以及下面的delete里,我们不能使用select语句,所以,这里给大家介绍一个sql的内置函数,updatexml()函数,这个函数接收三个参数,第一个参数是xml文件,第二个参数是用于指定要修改的节点位置,第三个参数是用于替换当前节点的值
因此,我们可以这样来打

'and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1) and'

3
4
拿捏,刺激!!!
这里数字1用来占位,十六进制的0x7e也是占位,中间的语句才是我们最终想要执行的语句。
对于后端真正执行的SQL则就变成了

insert into 表名 values('1'and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1) and'','1','1','1','1','1');

因为插入更新和删除语句里不允许直接有select,所以我们排除了之前的写法,又因为插入语句里的每一个值都必须和列数一一对应,我们巧妙地用逻辑符号and将三个结果变成一个结果,进而插入,对比后端执行地SQL语句,可知,原先第一个位置应该是‘1’(字符串)但是现在变成了false(布尔)。

  • “delete”注入
    这一关我们,先输入几个留言
    1然后还是用Burp进行抓包,这个时候,我们发现,是get请求,所以注入点在请求头那里,仔细看看id后面地参数,发现是数值型,为此,我们把上面地sql语句改改
    2
and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)

3
4
注入成功~~~~

  • “http header”注入

  • 盲注(base on boolian)

  • 盲注(base on time)

  • 宽字节注入

暂未完结
不定时更新
不定时更新
不定时更新

  • 32
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学徒钝子生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值