web漏洞
sql注入
SQL注入的产生条件
有参数传递
参数值带入数据库查询并且执行
类型
基于布尔的盲注
不返回数据库数据,结果false和true
基于时间的盲注
利用sleep()或benchmark()等函数让mysql执行时间变长
if(表达式,true,false)
if(length(database()>1,sleep(5),1))
基于报错注入
报错
多单引号
id=1'
extractvalue()
对XML文档进行查询的函数
语法:extractvalue(目标xml文档,xml路径)
concat()拼接
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘/’,(select database()))))
样例
报错
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))
error:~security
floor()
updatexml()
updatexml()函数与extractvalue()类似,是更新xml文档的函数。
语法updatexml(目标xml文档,xml路径,更新的内容)
样例
正常
select username from security.user where id=1 and (updatexml(‘anything’,’/xx/xx’,’anything’))
报错
select username from security.user where id=1 and (updatexml(‘anything’,concat(‘~’,(select database())),’anything’))
error:~security
geometrycollection()
multipoint()
polygon()
multipolygon()
linestring()
multilinestring()
exp()
原理
当传递一个大于709的值时,函数exp()就会引起一个溢出错误
样例
报错
elect exp(710);
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'
0按位取反就会返回“18446744073709551615”
~(select version())
18446744073709551610
报错
elect exp(~(select*from(select user())x));
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
联合查询注入
union注入
id=-1 union select 1,2,3
堆查询注入
分号隔开
引号闭合
#----#
其他
宽字节注入
数据库编码为
GBK
绕过单引号被转义
实现
id=1�'
id=1�
繁体“運”
/----
二次注入
1、向数据库插入查询语句,不被执行
2、数据库调用,报错,返回错误信息
cookie注入
base64注入
类型
数字型
输入的参数为整形
字符型
输入的参数为字符串
数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合
防御
1、使用预编译语句
构造的sql语句时使用参数化形式
参数化处理sql 是将参数进行了字符串化处理,把参数中的单引号,井号#,等都做了转义处理,进而在执行sql语句时不会被当做sql中的定界符和指定符来执行。
不使用拼接方式
2、过滤危险字符
关键字
不正常的符号
模块注入
xss
跨站脚本(XSS)攻击
类型
反射型
<非持久化>
攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容)
场景
搜索页面
存储型
<持久化>
代码是存储在服务器中的,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie
场景
在个人信息或发表文章等地方
DOM型
不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞
防御
1.对前端输入做过滤和编码
比如只允许输入指定类型的字符,比如电话号格式,注册用户名限制等,输入检查需要在服务器端完成,在前端完成的限制是容易绕过的
对特殊字符进行过滤和转义
<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)
2.对输出做过滤和编码:在变量值输出到前端的 HTML 时进行编码和转义
3.给关键 cookie 使用 http-only
控制
(1)后台登录处加一段记录登录账号密码的js,并且判断是否登录成功,如果登录成功,就把账号密码记录到一个生僻的路径的文件中或者直接发到自己的网站文件中。
(2)在登录后才可以访问的文件中插入XSS脚本
XSS蠕虫
存储型的 xss,并且需要访问量大的页面或者关注按钮
场景
如微博,论坛
csrf
CSRF(Cross-site request forgery)跨站请求伪造
客户端发起
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作
由于没有在关键操作执行时进行是否由用户自愿发起的确认
攻击过程
1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
防御
检验 Referer
二次验证,再次输入密码
筛选出需要防范 CSRF 的页面然后嵌入 Token
ssrf
SSRF(Server-Side Request Forgery:服务器端请求伪造)
服务器发起
由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统
1.内外网的端口和服务扫描
2.主机本地敏感数据的读取
3.内外网主机应用程序漏洞的利用
4.内外网Web站点漏洞的利用
...
出现场景
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
防御
1.禁止跳转
2.过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
3.禁用不需要的协议,仅仅允许http和https请求。可以防止类似于file://, gopher://, ftp:// 等引起的问题
4.设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)
5.限制请求的端口为http常用的端口,比如 80、443、8080、8090
6.统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
xxe
XML External Entity Injection,xml外部实体注入漏洞
当允许引用外部实体时,通过构造恶意内容可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
防御
1、使用开发语言提供的禁用外部实体的方法
2、过滤用户提交的XML数据
1.检查所使用的底层xml解析库,默认禁止外部实体的解析
2.使用第三方应用代码及时升级补丁
文件上传
文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
技巧
1、修改后缀,然后burp抓包截断后缀