欢迎光临散文网 会员登陆 & 注册

SQL手工注入保姆级教程(封神台黑客靶场1-1)

2023-02-17 19:21 作者:Growlbass  | 我要投稿

注:本教程仅供交流学习使用,请遵守网络安全相关法律法规,如果使用本技术对其他网站进行攻击,本人概不负责!

本教程需要一定的Mysql数据库知识,如果看不懂本教程中的代码可以学习Mysql。

现在由我来讲解一下封神台黑客靶场1-1 SQL注入攻击原理与实战演练。在开始实际操作前,我们先来了解一下sql注入到底是什么。由于一些开发者在开发过程中,直接将URL中的参数,http body中的post参数等其他外来用户输入参数与SQL语句进行拼接,导致了我们可以执行任何SQL语句。

例:<?php

            ...

            $id=$GET('id');

            $getid="select id from users where user_id=‘$id'";

            $result=mysql_query($getid) or die('<pre>'.mysql_error.'</pre>');

            $num=mysql_numrows($result);

以上PHP代码来自于CTF特训营P14

我们看一下$id这个变量,这个变量会直接与SQL语句进行拼接,那么,如果我们传入这样一段SQL指令:

-1‘ union select 1,2,3 --

那么,SQL语句将会变成

select id from users where user_id = '-1' union select 1,2,3

到这里可能会有这样一个疑问:为什么要闭合单引号且为什么有一个单引号没有了呢。

我们接下来逐一解答。

Q:为什么要闭合单引号?

A:我举一个例子你就明白了。如果我们不闭合单引号,这一段SQL语句将会变为

select id from users where user id = '-1 union select 1,2,3'

发现问题了吗,原本我们注入的SQL语句,在单引号中变成了字符串,导致我们注入的SQL语句无法执行。

Q:为什么有一个单引号不见了

A:--是Mysql中的注释符,注释掉了一个单引号,才能使得前面的单引号闭合。

如果没有注释,我们的SQL语句将会变成

select id from users where user_id = ''-1 union select 1,2,3'

说到这里,在看本教程的各位有没有对SQL注入的原理和方法有一个基本的了解呢?

——————分割线——————

原理和技术讲完了,我们现在进入靶场实战。

我们这次完成的是封神台黑客靶场1-1,关卡详情如下。

封神台靶场1-1题目详情

点击传送门后,我们进入了靶场,我们可以看到,靶场首页有一个链接。

靶场首页

点击链接后,我们跳转进了一个猫舍介绍界面,网址为cntj8003.ia.aqlab.cn?id=1

那么我们前面有讲过,可以利用GET进行传入SQL语句,我们来试一下。

靶场图片

首先我们传入一个单引号,来检查是否存在单引号闭合,如果传入后页面正常,则存在单引号闭合,如果传入后页面异常,则不存在单引号闭合,我们可以继续尝试双引号闭合。

传入单引号

传入单引号进入页面发现页面异常,则不存在单引号闭合,那么如果我们传入双引号呢?

单引号页面异常

返回结果依旧是页面异常,由此我们断定,此处无需闭合,那么,我们就可以放心的去传入我们的SQL代码了。

双引号页面异常

我们接下来就要去查询SQL语句向

该表查询了多少字段,这里使用Order by语句,为后面的联合查询做准备,因为联合查询需要有相同的字段数。

我传入了order by 1,页面回显正常,那么我们继续,order by 1,2,页面依旧回显正常,当我再次输入order by 1,2,3时,页面回显异常,到这里,我们可以判断出当前SQL语句查询了两个字段。

传入order by 1测试后页面回显正常(注意,这里我没有让页面回显)
传入order by1,2测试页面回显正常
传入order by1,2,3测试页面回显异常

通过order by知道了字段数后,我们接下来就可以进行联合查询了。

首先我们可以查询一下数据库名字,运用下面这段SQL语句

and 1=2 union select 1,database()

得到了数据库名字为maoshe

查询数据库名字

之后,我们可以尝试获取表名。

我们继续注入SQL语句

and 1=2 union select 1,table_name from information_schema.tables where table_schema='maoshe';

通过这个查询,可以查询出maoshe中的表名,我们得到了一个admin表(其实还有其他的表,但是,我只想用admin表,基本账号密码都在这个表中,但是,如果你想知道其他表名,可以使用limit,limit用法我会在后面讲到)

通过注入查询得到admin表

既然表名确定了,我们就要去猜字段了,我们继续查询。

and 1=2 union select 1,column_name from information_schema.columns where table_name='admin'

通过查询,我得到了一个id字段,但是,这并不是我们想要的结果,而且,这个表中不会仅有这一个字段。接下来,我们就要用到limit

在MySQL中,limit有一个遍历的功能(或许不叫这个名字,但我比较喜欢这样理解)

用法:limit 1,1 跳过第一个,查询后面一个。

            limit 2,1跳过第二个,查询后面一个

以此类推

那么,我说到现在,你可能猜到我要怎么做了。

得到了一个id字段

我们在我们上面的SQL语句中插入 limit 0,1  limit 1,1 limit 2,1来遍历字段。

我们分别得到了id,username,password字段,当然,你可以继续遍历,不过,既然得到了username和password字段,我们的目的达到了,为什么要继续遍历呢?

胜利近在咫尺,我们进行最后一步查询

我们要查询 username 和 password 字段的内容

查询username:and 1=2 union select 1,username from admin

查询password:and 1=2 union select 1,password from admin

查询到username为admin,password为hellohack

至此,封神台黑客靶场1-1顺利通关。

当然,本教程所讲为手工注入方法,同样可以使用sqlmap进行自动注入,这里就不进行介绍了。

希望大家能后喜欢本教程,后续我还会继续做其他系列,本教程中如果存在错误也欢迎指正,相互学习。

SQL手工注入保姆级教程(封神台黑客靶场1-1)的评论 (共 条)

分享到微博请遵守国家法律