CSRF、XSS、sql注入、DDOS流量攻击

CSRF攻击 (浏览器攻击):跨站请求伪造攻击 ,CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性
       攻击者一般会使用吸引人的图片去引导用户点击进去他设定好的全套,然后你刚登录的A网站没有关闭,这时候攻击者会利用JS事件去模拟用户请求A网站信息,从而就得到了目的。预防措施:为表单提交都加上自己定义好的token然后加密好,后台也一样的规则然后进行对比。
       跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站指令码(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
防范手段
对于上面说的第一个例子:
1、检查Referer字段:HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。
2、添加校验token


XSS攻击(服务端):跨站脚本攻击, XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌
       攻击者一般通过script标签对网站注入一些可执行的代码,这样就可以很轻松的获取到用户的一些信息。预防措施:strip_tags() 函数,过滤掉输入、输出里面的恶意标签和使用htmlentities()函数把标签字符串转换成html实体。

跨网站指令码(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程式的安全漏洞攻击,是代码注入的一种。它允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时就会受到影响。这类攻击通常包含了HTML以及使用者端脚本语言。




alert(“hey!you are attacked”)</script>
也可以做一些其他的事情,例如:
1、窃取网页浏览中的cookie值,为接下来的CSRF做准备
2、劫持流量实现恶意跳转
这个很简单,就是在网页中想办法插入一句像这样的语句:
window.location.href=”http://www.baidu.com”;</script>
3、注入脚本获得其他信息
常用的xss攻击绕过过滤的一些方法:
1、大小写绕过
http://192.168.1.102/xss/example2.php?name=alert(“hey !”)</scRipt>
2、利用过滤后返回语句再次构成攻击语句来绕过
http://192.168.1.102/xss/example3.php?name=pt–>alert(“hey!!”)</scRi</script>pt>
这个利用原理在于只过滤了一个script标签。
3、并不是只有script标签才可以插入代码
http://192.168.1.102/xss/example4.php?name=
4、编码脚本代码绕过关键字过滤
有的时候,服务器往往会对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用另一个语句eval()来实现。eval()会将编码过的语句解码后再执行。
例如alert(1)编码过后就是
\u0061\u006c\u0065\u0072\u0074(1)



防范手段
1、既然是代码注入攻击,那我们可以对敏感字符做转义,如下
str = str.replace(/&/g, “&”);
str = str.replace(/</g, “<”);
首先是过滤。对诸如



sql注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,因此可以对后台数据库进行查看等工作,甚至破快后台数据库造成严重后果。



SQL注入大致分为普通注入和盲注



普通注入:根据后台数据库提示有价值的错误信息进行注入
盲注:有经验的管理员在给出错误页面时,没有提供详细的错误信息。测试者需要运用脚本通过仅有的判断信息(比如时间差)对表中的每一个字段进行探测,从而实现注入的技术。
(盲注的难度较大,但注入测试中经常会遇到)
1,select * from [users] where username= ‘admin’ or ‘1’ and password=’admin’ or ‘1’
根据SQL中逻辑运算的优先级,or低于and,最后的or ‘1’永远成立,所以该条件表达式结果为True,此语句同等于下面的这条语句
2,$getid = “SELECT first_name, last_name FROM users WHERE user_id = ‘1’ and 1=1 order by 4 #’”;
#号将后续的引号注释了。order by 是用来查询列数的,当字段数超过数据库的字段数,数据库就会返回错误信息,因此,我们可以利用order by来猜测数据库的字段数。至此,如果熟悉SQL语句,那么可以进一步写入更多的语句,查询数据库,导致隐私数据泄露。



检测方法
1、通过web漏洞扫描工具进行对网站爬虫后得到的所有链接进行检测,或者手工判断是否存在注入点,一旦确认存在漏洞,可利用自动化工具sqlmap去尝试注入。



几种常见的判断方法:



1、数字型。测试方法:



http://host/test.php?id=100 and 1=1 //返回成功
http://host/test.php?id=100 and 1=2 //返回失败
2、字符型。测试方法:



http://host/test.php?name=rainman ‘ and ‘1’=‘1 //返回成功
http://host/test.php?name=rainman ‘ and ‘1’=‘2 //返回失败
http://host/test.php?name=rainman ‘ and ‘1’=‘2 )) //使用括号进行语句闭合
3、搜索型。搜索型注入:简单的判断搜索型注入漏洞存在不存在的办法是:



1)先搜索(‘),如果出错,说明90%存在这个漏洞。
2)然后搜索(%),如果正常返回,说明95%有洞了。
3)然后再搜索一个关键字,比如(2006)吧,正常返回所有2006相关的信息。
4)再搜索(2006%’and 1=1 and ‘%’=’)和(2006%’and 1=2 and ‘%’=’)。
4、绕过验证(常见的为管理登陆)也称万能密码



(1) 用户名输入: ‘or 1=1 or’ 密码:任意
(2) Admin’ – (或’or 1=1 or’ –)(admin or 1=1 –) (MSSQL)(直接输入用户名,不进行密码验证)
(3) 用户名输入:admin 密码输入:’ or ‘1’=‘1 也可以
(4) 用户名输入:admin’ or ‘a’=’a 密码输入:任意
(5) 用户名输入:’ or 1=1 –
(6) 用户名输入:admin’ or 1=1 – 密码输入:任意
(7) 用户名输入:1’or’1’=’1’or’1’=’1 密码输入:任意
5、不同的SQL服务器连结字符串的语法不同,比如MS SQL Server使用符号+来连结字符串,而Oracle使用符号||来连结:



http://host/test.jsp?ProdName=Book’ //返回错误
http://host/test.jsp?ProdName=B’+’ook //返回正常
http://host/test.jsp?ProdName=B’||’ook //返回正常说明有SQL注入
如果应用程序已经过滤了’和+等特殊字符,我们仍然可以在输入时过把字符转换成URL编码(即字符ASCII码的16进制)来绕过检查。
2、注释:大多数数据库系统使用“/”做为注释,Oracle使用“–”做为注释。
3、数据库指纹:
指纹一:观察应用返回的错误信息判断数据库类型。
指纹二:字符串拼接特点
Mysql:’test’ ‘ing’
SQLServer:’test’ + ‘ing’
Oracle:’test’ || ‘ing’
PostgreSQL:’test’ || ‘ing’
4、漏洞利用技术
1、联合查询SQL注入技术:UNION联合多个SQL语句。
2、SQL中逻辑判断使用技术:应用在盲注中,例如判断用户名第一个字符是不是“a”。
3、基于错误的注入技术:在SQL注入语句中加入执行函数语句。
4、外连攻击技术:在SQL注入语句中加入外连其他服务器的执行函数,使得连接到其他服务器。
5、延时攻击:注入语句中加入睡眠时间,以此根据响应时间判断猜测正确与否。
5、注释块(’/
sql /’)包含一个感叹号标记时(‘/! sql */’),MySQL可以对其进行解析,而其他数据库系统将其作为普通注释块。



6、SQL盲注
字符串长度:length(str)
基于时间的盲注:sleep()
不用引号实现字符串:CHR(104) || CHR(101) || CHR(108) || CHR(108) //返回字符串的ASCII码值
和以上相反:ASCII(‘r’) || ASCII(’o’) || ASCII(‘t’)
7、非关系型数据库(NoSQL):NoSQL注入攻击可以在过程语言中执行,而不是在声明式的SQL语言,所以潜在的影响要大于传统的SQL注入。



SQL注入如何防范
1.使用预编译语句,绑定变量。
2.使用安全的存储过程对抗SQL注入。
3.检查数据类型。
4.使用安全函数。



输入验证
检查用户输入的合法性,尽量的限制用户输入特殊的符号,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。



错误消息处理
防范SQL注入,还要避免出现一些详细的错误消息,因为可以利用这些消息。要使用一种标准的输入确认机制来验证所有的输入数据的长度、类型、语句、企业规则等。



加密处理
在一开始的CDNS例子中没有加密的数据就直接被利用了,但是加密了就不一定会解密成功,尽量不要用一些常见的加密算法,就算用也要使用32位以上的加密算法,将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了注入SQL命令。



存储过程来执行所有的查询
SQL参数的传递方式将防止利用单引号和连字符实施注入。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式了。



总结:1、对用户输入的内容要时刻保持警惕。
2、只有客户端的验证等于没有验证。
3、永远不要把服务器错误信息暴露给用户
预防措施:把一些sql语句进行过滤,比如delete update insert select * 或者使用PDO占位符进行转义。
DDOS流量攻击:攻击者通过漏洞往网页进行病毒木马的注入,一旦中了招,就成功成为肉鸡。



        最常见的攻击其中有一种SYN攻击,它利用tcp协议往服务器发送大量的半连接请求,当半连接队列达到最大值的时候,正常的数据包会被服务器丢弃,最后你网站可能一分钟不到就不不开了。



预防措施:1、正确设置防火墙
2、禁止对主机的非开放服务的访问
3、限制特定IP地址的访问
4、启用防火墙的防DDoS的属性
5、严格限制对外开放的服务器的向外访问
6、运行端口映射程序祸端口扫描程序,要认真检查特权端口和非特权端口。过滤没必要的服务和端口、定期扫描漏洞进行处理、利用路由器进行防护(路由器死掉后重启一下即可不会影响服务器)或者网路没有瘫痪的情况下,可以查一下攻击来源,然后临时把这些IP过滤一下



xss可以结合csrf使用;
在通过xss获得目标用户的cookie后,打开目标网站的登录界面,调出Chrome控制台的Application面板,调至cookie选项卡:
再把目标用户的cookie填进去,再把过期时间调长一些,
完成之后再次刷新页面,发现已经不是之前的登录界面了,而是登录后的界面。至此,一个从cookie窃取到利用的过程就已完成。



XSS攻击大致上分为两类:



一类是反射型XSS,又称非持久型XSS,
一类是储存型XSS,也就是持久型XSS。
什么是反射型XSS
其实,我们上面讲XSS的利用手段时所举的例子都是非持久型XSS。



也就是攻击相对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过url的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。



也就是说想要触发漏洞,需要访问特定的链接才能够实现。



什么是储存型XSS
它与反射型XSS最大的不同就是服务器再接收到我们的恶意脚本时会将其做一些处理。



例如储存到数据库中,然后当我们再次访问相同页面时,将恶意脚本从数据库中取出并返回给浏览器执行。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。



还记得在文章开头提到的留言板的例子吗?那通常就是储存型XSS。当有人在留言内容中插入恶意脚本时,由于服务器要像每一个访客展示之前的留言内容,所以后面的访客自然会接收到之前留言中的恶意脚本而不幸躺枪。



这个过程一般而言只要用户访问这个界面就行了,不像反射型XSS,需要访问特定的URL。


Category web