Web第二周学习

[TOC]

login

题目

需要密码才能获得flag哦

题目链接:http://web.jarvisoj.com:32772

基本思路:

客户端将用户输入的字符串传递给了服务器端,而服务器端需要和真正的password进行对比,所以我用burp来进行分析

login

我通过burp获取到了response的header,分析其中的hint

Hint:”select * from admin where password=’”.md5($pass,true).”‘“

第二个值为TRUE,说明通过md5加密后的字符串是16位原始二进制的数

md5

后面有关PHP的一些东西我是参考了网上相关的blog,下面将一些东西引用过来

“a string starting with a 1 is cast as an integer when used as a boolean.”
在mysql里面,在用作布尔型判断时,以1开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。当然在我后来测试中发现,不只是1开头,只要是数字开头都是可以的。
当然如果只有数字的话,就不需要单引号,比如password=‘xxx’ or 1,那么返回值也是true。(xxx指代任意字符)

login_答案

之后我们就可以获得相应的flag

神盾局的秘密

题目

这里有个通向神盾局内部网络的秘密入口,你能通过漏洞发现神盾局的秘密吗?

题目链接:http://web.jarvisoj.com:32768/

基本思路

刚看到的时候属实有点小懵,不明白到底要让我干啥,还是借鉴了几篇blog才明白,参考的blog在最后给出

解题过程

刚开始打开,只能看到一个图片

神盾局

在控制台打开之后发现了被base64编码之后的字符串

解码前:c2hpZWxkLmpwZw==

解码后:shield.jpg

此处用的base64的在线解码的网站,mark一下,方便之后使用,网站入口

之后我通过看其他的blog看到需要访问index.php(但是说实话,我到现在还是有点不明白为啥要访问这个文件)

编码前:index.php

编码后:aW5kZXgucGhw

之后的话修改访问的文件链接,即可获得index.php文件的内容

<!--?php 
	require_once('shield.php');
	$x = new Shield();
	isset($_GET['class']) && $g = $_GET['class'];
	if (!empty($g)) {
		$x = unserialize($g);
	}
	echo $x--->

可以发现该index.php文件有三个作用

  1. 它require_once了shield.php文件
  2. 它可以获取一个名为class的参数
  3. 之后它将这个参数进行了反序列化

发现有一个shield.php文件,进行base64的编码

编码前:shield.php

编码后:c2hpZWxkLnBocA==

同样的方式,打开shield.php文件

<!--?php
	//flag is in pctf.php
	class Shield {
		public $file;
		function __construct($filename = '') {
			$this --->

在注释中发现pctf.php,同样进行base64编码后访问,但是并没有做完(我要裂开了,这到底是因为啥。。)

神盾局_1

再重新对代码进行审计,发现之前少访问了showimg.php这个文件

<!--?php
	$f = $_GET['img'];
	if (!empty($f)) {
		$f = base64_decode($f);
		if (stripos($f,'..')===FALSE && stripos($f,'/')===FALSE && stripos($f,'\\')===FALSE
		&& stripos($f,'pctf')===FALSE) {
			readfile($f);
		} else {
			echo "File not found!";
		}
	}
?-->

发现其中对于解码后的文件名是“pctf”进行了限制,所以不能通过这种方式来获取文件内容

之后就需要用到index.php了(前面已经提到过index.php的作用)

index.php在接收到这个class之后,会把这个参数反序列化,并且来创建一个shield对象,之后是调用这个对象的readfile方法

所以我们需要做的事情是创建一个我们需要的shield对象,并且继续宁一个序列化输出之后,就是我们所要得到的class参数的值

<?php
class Shield {
        public $file;
        function __construct($filename = 'pctf.php') {
            $this -> file = $filename;
        }
}
$str = new Shield();
echo serialize($str);
?>

之后再将构造所得的输入进去,在控制台可以看到我们想要得到的结果

<!--?php 
	//Ture Flag : PCTF{W3lcome_To_Shi3ld_secret_Ar3a}
	//Fake flag:
	echo "FLAG: PCTF{I_4m_not_fl4g}"
?-->

参考资料

反序列与序列化函数的作用

PHP反序列化漏洞原理及举例

神盾局的秘密

知识点

PHP反序列化漏洞

反序列化与序列化

感觉这道题花费时间有点小长,主要是有很多的地方感觉一点没明白,像PHP的基本语法、PHP文件等地方。而且更重要的是感觉到现在并没有构建一个大致的理论框架来进行支撑。

in a mess

题目

连出题人自己都忘了flag放哪了,只记得好像很混乱的样子。

题目链接:http://web.jarvisoj.com:32780/

基本思路

在看到链接的id = 1的时候,我觉得有可能与SQL数据库操作有关系,之后可以在控制台上看到一些线索

解题过程

mess

之后对于index.phps进行访问(因为php文件都是在索引之后,发送回客户端之前就会进行执行的,所以在客户端只能通过查看源码来进行代码分析)

&lt;?php

error_reporting(0);
echo "&lt;!--index.phps--&gt;";

if(!$_GET['id'])
{
	header('Location: index.php?id=1');
	exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
	echo 'Hahahahahaha';
	return ;
}
$data = @file_get_contents($a,'r');
if($data=="1112 is a nice lab!" and $id==0 and strlen($b)&gt;5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
	require("flag.txt");
}
else
{
	print "work harder!harder!harder!";
}


?&gt;

后面的有的地方还没明白,在看一些和SQL以及PHP相关的资料,具体内容稍后上传


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

Web_Security_lab1 上一篇
7/24Web一周总结 下一篇