web端攻击基础
我们在这里不讨论攻击手段,而是只是谈谈基本的攻击预防,想当初寡人也想尝试着去做一些黑客入侵,然而现今的防御手段已经大大升级,目前网上的大多数攻击教程都基本失效了。。。
之所以会想到写这个博文不是说凑文章数、炒冷饭,而是最近在公司的一个业务中发现了这样的bug,我自己成功的对公司的产品进行了 ==Form表单注入==,虽然是个比较低级的bug,但是难保在繁重的开发任务中会每一个环节都那么仔细,总会有疏漏。
常规的攻击方法baidu一下你就知道,啊呸,不对,常规的攻击方法 baidu一下你确实就能知道,无非就以下几种
* url注入
* form注入
* 等(卧槽 这个“等”是什么鬼)
参考链接: szhshp的第三边境研究所 — Web端脚本攻击基础
首先我们开看看URL注入
##URL注入
URL注入一般用于asp或者php页面。
相较之下==URL注入==很简单,有些页面为了方便直接将必要参数(例如ID等数据)通过URL参数传过去
懒得自己截图了,于是从友链的博客里偷一张
对应这样的后台SQL也许是这样的
SELECT ... FROM employer WHERE jopid = [URL.jobid]
甚至我们可以输入一些特定的数据库操作语句, 例如我们将URL后方的参数改为
xxx.cfm?jobid=1; delete from employer
后台的SQL就会变为
SELECT ... FROM employer WHERE jopid = 1; delete from employer;
虽然格式有些混乱但是依然没有运行错误, 结果就是表中所有数据都被意外删除了.
在我们刚开始攻击的时候可能不清楚对应服务器的数据库系统以及后台语言, 但如果没有对错误进行catch而是直接抛给用户的话, 那么Attacker就可以了解到对应配置(数据库系统及服务器系统等), 更加方便其进行攻击。
常用的URL注入:
* 1' or '1'='1 判断是否有注入点
* 根据页面返回情况,对有注入点的页面进行深层次的 注入判断 和 SQL注入
具体细节我就不说了,有兴趣的可以去baidu、google、bing
##form表单注入
继续盗图
这样一个登陆页面\n\n后台SQL代码假设是:
SELECT ... FROM user WHERE name=xxx and password=xxx
正常情况我们会输入合法的账号和密码并提交, 但是Attacker会在输入框中使用各种SQL使得后台的SQL出现异常, 比如:\n\n> 用户名随意输入
密码输入xxx' or 'a'='a
那么结果就是 后台SQL语句被篡改
SELECT ... FROM user WHERE name='abcdef' and password='xxx' or 'a'='a'
显然上述SQL是绝对成立的, 因此可以顺利进行后方的业务逻辑, 如此Attacker在不知道密码的情况下就可以使用任何用户的身份登录
##SQL注入的预防
1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双”-“进行转换等.
2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取.\n3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接.\n4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息.\n5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中.
##常现的bug
* ` <input />`
* `<textarea>`
* `<div contenteditable="true"></div>`
以上三个是最容易导致SQL注入的情况,简单的说就是 凡是页面上 允许用户输入的 都有可能成为 Attacker的攻击处\n\n比如 以下情况:
* <input style="width:100%" type="text" value="<script>alert(1)</script>" />
* <textarea style="width:100%;"><script>alert(1)</script></textarea>
* <div contenteditable="true"><script>alert(1)</script></div>
如果此时有个提交按钮让我们把以上内容提交到后台
如果后台没有进行过滤特殊字符, 或者对不可预料的输入进行编码的话\n后果就会是这样
###所以如何预防 [XSS] [1]?
1. 和SQL Injection类似, 永远不要相信用户的输入. 过滤特殊字符, 对不可预料的输入进行编码
(我在写这篇博文的时候 在 可编辑的`<div contenteditable="true"></div>`就使用了编码`<script>alert(1)</script>` 不然 你现在看到的文章就会有 `alert`弹窗)
2. 使用HTTP头指定类型
3. 对于用户
* 尽可能使用最新版的浏览器, 以保证安全性
[1]:https://www.baidu.com/s?wd=xss&rsv_spt=1&rsv_iqid=0xfb6ad1d600000310&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=4&rsv_sug1=4&rsv_sug7=100&rsv_sug2=0&inputT=832&rsv_sug4=833