利用漏洞对计算机进行攻击渗透,前提是服务器能正常通信。服务器提供各种服务给客户端进行使用的。它是依靠端口来进行通信,黑客也是根据端口来进行入侵的。那么也不排除一些物理攻击的方式,例如社会工程学①等。
一、越权访问
不同权限账户之间的存在越权访问。
- 不同权限用户之间连接访问造成的功能、数据越权。
- 不同权限用户之间替换用户cookie造成的越权。
- 不同权限用户之间修改id造成的越权。
检测方法:
- 使用工具抓取A用户功能链接,然后登录B用户对此链接进行访问。
- 使用抓包工具抓取A用户ID并将此ID改成B用户的ID,查看是否可以操作B用户的功能或查看B的用户数据
- 使用抓包工具替换不同用户cookie的方法进行测试。
防护方案:在后台服务做严格的用户权限验证。
二、SQL注入
攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取web shell或者服务器系统权限。
检测方法:
- 识别用户输入。SQL注入漏洞可能在系统输入参数中,这些参数执行数据库操作。
- GET、POST参数中。
- COOKIE参数中。
- http请求头。主机头、引用站点(referer)、User-Agent和X-Forwarded-For等。
- 检测SQL注入。使用SQL注入测试语句对输入参数进行测试。
- 特殊符号:单引号,分号,web服务器响应报错。
- 条件响应:and 1=1、and 1=2、' or '1'='1、' or '1'='2,两次web服务器响应不同。
- 时间延时:sleep(5)、waitfor delay '0:0:5',系统服务器延迟响应。
- 参数相加:对数字类型进行加减运算,字符类型使用数据库连接符号进行连接。系统服务器响应与原来的响应相同。
- 利用SQL注入。对以上测试进一步利用,手工构造SQL注入语句或者使用SQLMAP检测脚本构造注入语句。
防护方案:对输入参数进行过滤、校验或者采用参数预处理的方式。
三、XSS跨站脚本漏洞
攻击者的输入没有经过严格的控制,最终显示给来访的用户,攻击者通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java, VBScript, ActiveX, Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、个人网页内容、会话和cookie等各种内容。XSS漏洞包括但不仅限于:存储型XSS、反射型XSS、链接注入、框架钓鱼等。
检测方法:
查找可能出现XSS跨站的位置,网站搜索框、信息存储等。
- 对可能出现XSS跨站的位置进行输入,常用测试语句为:<script>alert(“XSS”)</script>
- 查看网站网页源代码,测试语句是否在系统响应HTML代码中输出。没有输出则不能进行XSS跨站利用。
- 对有测试语句输出的响应HTML代码,进行构造使XSS测试代码能当做JavaScript代码执行。
防护方案:对用户的输入参数进行过滤、校验;输出的参数进行html实体编码。过滤、校验或者实体编码要覆盖的系统内所有参数;过滤规则强大可以有效的防止注入;系统前后端都要进行过滤。
四、任意文件上传漏洞
在应用系统的运营过程中,不可避免地要对网站的某些页面或者内容进行更新,这时便需要使用到网站的文件上传的功能。如果不对被上传的文件进行限制或者限制被绕过,该功能便有可能会被利用于上传可执行文件、脚本到服务器上,进而进一步导致服务器沦陷。
检测方法:
- 找到系统中可以上传文件的地方。
- 上传系统要求的合法文件,确定上传点可用。
- 上传Web Shell。
- 访问上传Web Shell文件的链接地址。
防护方案:
- 对文件格式限制,只允许某些格式上传。
- 对文件格式进行校验,前端和服务器都要进行校验(前端校验扩展名,服务器校验扩展名、Content Type等)。
- 将上传目录防止到项目工程目录之外,当作静态资源文件路径,并且对文件的权限进行设定,禁止文件下的执行权限。
五、目录遍历攻击漏洞
攻击人员通过目录便利攻击可以获取系统文件及服务器的配置文件等等。一般来说,他们利用服务器API、文件标准权限进行攻击。严格来说,目录遍历攻击并不是一种web漏洞,而是网站设计人员的设计“漏洞”。如果web设计者设计的web内容没有恰当的访问控制,允许http遍历,攻击者就可以访问受限的目录,并可以在web根目录以外执行命令。
检测方法:
- 爬行或者暴力破解系统目录结构。
- 在浏览器地址栏输入网站目录,http://www.test.com/test/,查看test文件夹内的文件能否被列出来。
防护方案:
- 净化数据:对用户传过来的文件名参数进行硬编码或统一编码,对文件类型进行白名单控制,对包含恶意字符或者空字符的参数进行拒绝。
- web应用程序可以使用chrooted环境包含被访问的web目录,或者使用绝对路径+参数来访问文件目录,时使其即使越权也在访问目录之内。www目录就是一个chroot②应用。
六、关键会话重放攻击
不断恶意或欺诈性地重复一个有效的数据包,重放攻击者可以拦截并重复发该数据到服务端,服务器端未对用户提交的数据包重放进行有效限制。如:可以抓取HTTP包中固定账号破解密码、固定密码破解账号、破解用户名和重放提交投票数据包。
检测方法:
- 使用抓包工具去抓取系统登录请求,获得用户和密码参数。
- 使用用户或密码字典替代登录请求会话中对应的用户或密码参数。
- 开始尝试暴力破解。
防护方案:添加token验证、时间戳或者图片验证码。token、时间戳和图片验证码在服务器后端刷新,数据包提交一次数据刷新一次;对固定账号破解密码、固定密码破解账号会话重放都要进行限制;对系统关键操作进行防护,如登录操作。
关键会话重放攻击漏洞防护token生成代码示例
关键会话重放攻击漏洞防护token验证代码示例
关键会话重放攻击漏洞防护代码示例
七、CSRF(跨站请求伪造)
跨站请求伪造(Cross-Site Request Forgery,CSRF)是一种使已登录用户在不知情的情况下执行某种动作的攻击。因为攻击者看不到伪造请求的响应结果,所以CSRF攻击主要用来执行动作,而非窃取用户数据。当受害者是一个普通用户时,CSRF可以实现在其不知情的情况下转移用户资金、发送邮件等操作;但是如果受害者是一个具有管理员权限的用户时CSRF则可能威胁到整个Web系统的安全。
检测方法:
- 登录网站,使用工具构造CSRF POC,并保存在HTML文件中。
- 将构造好的HTML页面放到另一台服务器上。
- 访问HTML文件链接地址,构造HTML的预期功能实现,并确认存在CSRF漏洞。
防护方案:基本上和关键会话重放攻击防护方案一致。添加token验证、时间戳或者图片验证码。token、时间戳和图片验证码在服务器后端刷新,数据包提交一次数据刷新一次;对系统关键操作进行防护,如用户操作。
八、明文传输
对系统用户口令等机密信息的保护不足,攻击者可以利用攻击工具,从网络上窃取合法用户的口令数据,从而登录系统执行非法操作。
检测方法:
- 使用工具抓取关于用户口令的数据包(如登录、添加用户、更改密码等)。
- 查看数据包中提交的相关参数,系统内所涉及到口令等隐私数据传输地方应做加密处理(不包含使用MD5等易被破解的加密方式和Base64编码、URL编码等)。
防护方案:
- 对传输的密码信息做加密处理。
- 不要采用容易被破解的加密方法(如md5加密)和编码方式(如base64编码、url编码等)。
- 建议采用国家密码主管部门要求的加密算法(SM2、SM4等),或其他低风险算法(AES256、RSA2048)
明文传输漏洞前端防护代码示例
明文传输漏洞后端防护代码示例
规范编程在安全防护中的重要意义
在我们项目开发过程中,复杂的算法或逻辑只占项目中很小的比例,大多仅仅是垒代码的工作。可是越是简单,测试的bug反而是越多,而且可能会修改一个bug又引起另外一个bug。这里很大的程度上是由于编码不规范所致。例如没有规范的对输入输出参数的校验,没有规范的异常处理,没有规范的日志处理等等,不但导致了我们总是出现类似空指针这样低级的bug,而且甚至会导致系统出现安全漏洞,成为网络攻击的渠道。相反,在规范的开发中,bug不但可以有效减少,查找bug也变得轻而易举。规范编程不是对开发工程师的制约,而确实是有助于提高开发效率和代码的安全性、易读性。
规范编程的两种方式:
一种是在开发过程中所有开发人员都要遵守一个提前制定的编程规范标准,例如《阿里巴巴 Java 开发手册》,还有根据此手册开发的Eclipse 和 IntelliJ 的代码检查插件,此方式主要针对新项目或者开始不久的项目。
如果是已完成的项目或者完成过半的项目,再回去review代码,可能就要多耗费不少的工作量,这里就可以用到静态代码扫描③工具,例如Fortify、Checkmarx、360代码卫士等工具。
- Fortify 性能较好,扫描速度快,但测试结果依赖于编译环境,对代码自身质量要求更高,要求代码能够脱离开发平台独立编译。
- Checkmarx 不依赖于编译,支持的语言更多,速度更慢,等同于360代码卫士。
结合几款工具的优缺点和自身项目的实际情况,可以自行选择使用哪款工具。
源代码扫描可降低应用系统的安全风险,减少软件代码编写中可能出现的安全漏洞,提高应用系统自身安全防护能力。采用源代码安全扫描,能够快速、准确地查找,定位和修复软代码中存在的安全风险。不仅节省了大量的人力和时间成本,提高开发效率,并且能够发现很多靠人力无法发现的安全漏洞,极大降低了软件的安全风险,从而提高软件系统的安全性及稳定性。同时,对软件源代码进行扫描是保证源代码的质量,确保系统稳定高效运行的必要检验途径。
网络信息安全是一个随时都在发展和变化的动态事物,攻击的领域已经由传统的网络和系统层面上升到了应用层面。应用系统的安全性能,一方面立足于系统安全方案的分析与设计,而另一方面同样也取决于系统实现过程中是否存在安全性缺陷。从代码的规范开发到功能测试再到安全测试是一个严谨的过程,缺一不可,都是为了降低应用系统的安全风险,减少软件代码编写中可能出现的安全漏洞,提高应用系统自身安全防护能力。
本人主攻java语言方向,文中代码示例都是采用的java语言编写,虽然可能用的开发语言不一样,但是解决问题的思路是一样的。不便之处,敬请见谅。
名词解释
社会工程学
凯文·米特尼克在《反欺骗的艺术》中曾提到,人为因素才是安全的软肋。很多企业、公司在信息安全上投入大量的资金,最终导致数据泄露的原因,往往却是发生在人本身。你们可能永远都想象不到,对于黑客们来说,通过一个用户名、一串数字、一串英文代码,社会工程师就可以通过这么几条的线索,通过社工攻击手段,加以筛选、整理,就能把你的所有个人情况信息、家庭状况、兴趣爱好、婚姻状况、你在网上留下的一切痕迹等个人信息全部掌握得一清二楚。虽然这个可能是最不起眼,而且还是最麻烦的方法。一种无需依托任何黑客软件,更注重研究人性弱点的黑客手法正在兴起,这就是社会工程学黑客技术。
Chroot
chroot是在Unix系统的一个操作,针对正在运作的软件进程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由chroot设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容。chroot这一特殊表达可能指chroot(2)系统调用或chroot(8)前端程序。由chroot创造出的那个根目录,叫做“chroot监狱”(chroot jail,或chroot prison)。
静态代码扫描
静态源代码扫描是近年被人提及较多的软件应用安全解决方案之一。它是指在软件工程中,程序员在写好源代码后,使用一些扫描工具对其进行扫描,找出代码当中存在的一些语义缺陷、安全漏洞的解决方案。静态扫描技术已经从90年代时候的,编码规则匹配这种由编译技术拓展过来的分析技术向程序模拟全路径执行的方向发展,由此,这种模拟执行相对的执行路径比动态执行更多,能够发现很多动态测试难以发现的缺陷。