攻防世界Web(难度1)

发布于:2023-01-04 ⋅ 阅读:(546) ⋅ 点赞:(0)

Training-WWW-Robots

解题 

翻译:

在这个小小的训练挑战中,您将了解Robots_exclusion_standard。
txt文件是由网络爬虫程序用来检查他们是否被允许爬行和索引你的网站或仅部分。
有时这些文件会显示目录结构,而不是保护内容不被抓取。

享受吧!

通过阅读,提示我们可以尝试利用robots.txt得到更多信息。 

 

 根据提示,利用/fl0g.php即可得到flag。

 PHP2

解题 

翻译:

你能试试这个网站吗?

 

 先用index.php查看页面,结果发现无变化。

 继而转变思路用index.phps查看,得到主页源代码。

 进行代码审计,可看出需要用GET方式给id参数传递一个为“admin”的值,但是会经过一次urldecode(),将传入的值进行url解码。

这里需要注意,当我们在浏览器输入admin时,浏览器会对admin进行一次url解码,所以需要对admin进行两次url编码。

 最后构造payload,得出flag。

unserialize3

反序列化漏洞(序列化←→反序列化)

什么是序列化(serialize)

将对象的状态信息转换为可以存储或传输的形式的过程,简单来说,就是将状态信息保存为字符串

什么是反序列化(unserialize)

将字符串转换为状态信息

PHP内的几个特殊魔术方法

  1. __construct():当对象创建(new)时会自动调用,但在unserialize()时是不会自动调用的(构造函数)
  2. __destruct():当对象操作执行完毕后自动执行destruct()函数的代码
  3. __wakeup():unserialize()时自动调用,且__wakeup优先级高于__destruct,wakeup时会将warn值进行过滤,变为null值,所以不能使wakeup执行
  4. __call()方法当调用类实例中不存在的函数时自动执行

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为魔术方法(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能
注意:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
__sleep() 和 __wakeup()
public __sleep ( void ) : array
__wakeup ( void ) : void
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
Note:
(1)__sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。
(2)__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
(3)与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
(4)__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
public(公有):公有的类成员可以在任何地方被访问。
protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有):私有的类成员则只能被其定义所在的类访问。
unserialize() 将已序列化的字符串还原回 PHP 的值。
序列化请使用 serialize() 函数。
语法
unserialize(str)
参数 描述
str 必需。一个序列化字符串。
__wakeup()是用在反序列化操作中。unserialize()会检查存在一个__wakeup()方法。如果存在,则先会调用__wakeup()方法。

当使用unserialize()恢复对象时,将调用__weakup(),serialize()函数将表单内容序列化成一个字符串。

O:7:"convent":1:{s:4:"warn";s:10:"No hacker.";}  

O代表object(为A时代表Array),7代表"convent"占7个字符长度,1代表着对象具有一个变量:warn,s代表string,字符型(如果为i,代表int型)

里面的值是不可修改的,但是可以修改的属性(变量)数大于实际的个数时,就可以绕过 wakeup

构造payload:O:7:"convent":2:{s:4:"warn";s:10:"No hacker.";}【其实就是将1改为2,目的达到随便改都行】

最后将构造的payload传入即可。

解题 

根据__wakeup魔术方法和题目名字,可以猜到这里是用到了php反序列化

进行代码分析

class xctf{                      //定义一个名为xctf的类
public $flag = '111';            //定义一个公有的类属性$flag,值为111
public function __wakeup(){      //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
?code=                           //可能是在提示我们http://111.198.29.45:30940?code=一个值进行利用

代码中的__wakeup()方法如果使用就是和unserialize()反序列化函数结合使用的,这里没有序列化字符串。所以,我们这里实例化xctf类并对其使用序列化(这里就实例化xctf类为对象peak)

<?php
class xctf{                      //定义一个名为xctf的类
public $flag = '111';            //定义一个公有的类属性$flag,值为111
public function __wakeup(){      //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
$b = new xctf();           //使用new运算符来实例化该类(xctf)的对象为b
echo(serialize($b));       //输出被序列化的对象(b)
?>

O:4:"xctf":1:{s:4:"flag";s:3:"111";}
/*xctf类后面有一个1,整个1表示的是xctf类中只有1个属性
__wakeup()漏洞就是与序列化字符串的整个属性个数有关。当序列化字符串所表示的对象,
其序列化字符串中属性个数大于真实属性个数时就会跳过__wakeup的执行,从而造成__wakeup()漏洞
*/

 因此,我们要反序列化xctf类的同时还要绕过__wakeup方法的执行(如果不绕过__wakeup()方法,那么将会输出bad requests并退出脚本),__wakeup()函数漏洞原理:当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。因此,需要修改序列化字符串中的属性个数:
当我们将上述的序列化的字符串中的对象属性个数由真实值1修改为2,即如下所示

O:4:"xctf":2:{s:4:"flag";s:3:"111";}
O代表结构类型为:类:4表示类名长度:接着是类名:属性(成员)个数
大括号内分别是:属性名类型;长度:名称:值类型:长度:值

url访问

 ics-06

 解题

只有报表中心可以打开,修改id也不变。

 使用burpsuite抓包

使用Intruder模块

Intruder——入侵者

检测可能存在漏洞的连接,调用攻击载荷,对目标链接进行攻击。

主要原理是根据访问链接中存在的参数/变量,调用本地词典、攻击载荷、对目标链接进行渗透测试

将目标导入Intruder模块

点击Positions

配置有效载荷将插入基本请求的位置攻击类型确定有效载荷分配给有效载荷位置的方式

这里选择Sniper方式

  • Sniper:对变量依次进行破解。多个标记依次进行
  • Battering ram:对变量同时进行破解。多个标记同时进行
  • Pitchfork: 每一个变量对应一个字典,取每个字典对应项
  • cluster bomb:每个变量对应一个字典,并且进行交集破解,尝试各种组合。适用于用户名+密码

 

使用这个分节符§标记有效负载的位置

当把一个有效负载放置到一个给出请求的特殊位置上,就会有§

两个分节符之间的出现的文本都会被有效负载替换

当特殊位置没为一个给出的请求安排有效负载,§位置的字符会被删除,出现在他们之间的文本不会变化

点击Payloads

设置有效负载

定义一个或多个有效负载,有效负载的数量取决于攻击类型定义

对于位置标签中定义的攻击类型,可以为每个有效载荷集合提供有效荷载类型

payload set:指定需要配置的变量

payload type:Payload类型

== 这里将payload type类型改为 Number==

此有效载荷类型在给定范围内以指定格式生成数字有效载荷

点击strat attack

然后就出现了这个,这个是软件bug,需要点击Number format的Base 的Hex再点回Decimal,让软件刷新一下

 出现不一样的长度1901,查看请求头信息id=2333

 修改id=2333

view_source
view-source是一种协议,早期基本上每个浏览器都支持这个协议。后来Microsoft考虑安全性,对于WindowsXP pack2以及更高版本以后IE就不再支持此协议。但是这个方法在FireFox和Chrome浏览器都还可以使用。 如果要在IE下查看源代码,只能使用查看中的"查看源代码"命令。
 
  以前的使用方法:在浏览器地址栏中输入
  view-source: sURL
  回车即可看到当前网页的源代码了。
 
       JS用法:
       window.location="view-source:" + window.location

浏览器直接查看源码

题目来源:Cyberpeace-n3k0

题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。

baby_web 

知识补充:

index.php的状态是302什么意思?
302 Found,原始描述短语为 Moved Temporarily(临时搬家) ,是HTTP协议中的一个状态码(Status Code)。可以简单的理解为该资源原本确实存在,但已经被临时改变了位置;换而言之,就是请求的资源暂时驻留在不同的URI下,故而除非特别指定了缓存头部指示,该状态码不可缓存。

 访问index.php跳转到1.php这种情况又是什么原理呢?
一般原网页被换地方后,有人访问该网页是会被自动定向到另一个设置好的网页,且临时URI应该由响应头部中的 Location 字段给出。

 解题

页面检查 获取flag

 观察URL,当前所在页面是1.php。提示让我们去找初试页面,先想到了index.php。

尝试后发现又跳回1.php了,可能是加了自动跳转。

是302,给出的Location是1.php,代表网页请求的重定向,也就是从index.php重定向至1.php去了。 

 本题我们通过查看http返回请求包的状态码得知网站是否发生跳转,以及跳转的位置。

 burp抓包 

inget 

 

 解题

 web页面GET请求注入。猜测这是SQL注入的题目。

 easyupload

解题

fileinclude

本文含有隐藏内容,请 开通VIP 后查看