题目

做法
启动靶机,打开给出的网址



输入1、1’、1″判断SQL语句闭合方式





注:以下sql语句如’1″ ‘ 实际上是’1″‘ ,这里只是为了快速区分
(1)一般情况下,SQL语句闭合方式为单引号
当用户名为1时,形成的sql语句是 select * from table_name where username=’1′ and password=’123′;
当用户名为1″时,形成的sql语句是正确的 select * from table_name where username=’1″ ‘ and password=’123’;
当字符串内需要包含双引号时,除了使用转义字符外,也可以使用一对单引号来包括字符串。此时字符串内的双引号被视为普通字符,无需特殊处理
同理,当字符串内需要包含单引号时,除了使用转义字符外,也可以使用一对双引号来包括字符串。此时字符串内的单引号被视为普通字符,无需特殊处理
补充
使用(转义字符)来判断SQL注入的闭合方式 原理:当闭合字符遇到转义字符时,会被转义,那么没有闭合符的语句就不完整了,就会报错,通过报错信息我们就可以推断出闭合符。
分析报错信息:看\斜杠后面跟着的字符,是什么字符,它的闭合字符就是什么,若是没有,则为数字型。 (但是在本题中有两个变量,这个方法不太适用)
当用户名为1’时,形成的sql语句是错误的 select * from table_name where username=’1′ ‘and password=’123’;
第一个单引号和第二个单引号形成了新的闭合,剩余第三个单引号,组成的sql语句不正确,于是语句报错
因此,SQL语句闭合方式是单引号
(2)假设MySQL语句为双引号闭合
username输入1时,形成的sql语句是正确的 select * from table_name where username=”1″and password=”123″;
username输入1″时,形成的sql语句是 select * from table_name where username=”1″ “and password=”123”; 正确的SQL语句不可以出现一对双引号包含双引号的。所以上面这条应该出现SQL报错,但实际没有报错,因此我们假设的双引号闭合方式是不成立的
username输入的是1’,形成的sql语句是正确的,不会报错 select * from table_name where username=”1′ “and password=”123”; 而然实际上这条语句报错了,因此我们假设的双引号闭合方式是不成立的
综上,我们可以推出SQL语句闭合方式是单引号
进行SQL注入
万能账号密码获取入口: 万能账号密码使用详解,渗透测试常用的入门级操作 – 知乎
由上得:该数据库的闭合方式为单引号
因此,在理解完以上网页内容后,我们回归该题
当我们不知道用户的账号并且不知道用户的密码时,可以使用万能账号 我们随便挑选一个——a or true #
但是它上面的万能账号都没有加单引号’或是双引号”
因此,综上,我们需要在a后面加上本题的闭合符号,“ ‘ ” 得出我们所需的账号为a’ or true #
密码随便输即可(但是看到其他人通常这种情况都直接写一样的,不知道有啥玄机在里面,这里注意一下)


补充做法(使用HackBar,不过跟上面的大差不差)
自行下载HackBar V2
前提: 先看测试后的网址(与为刚从靶机点进来的网址进行对比),可以看到我们输入的账号密码都显示在url中,可知此处是get传参
补充:get传参——参数和 URI 之间用问号?隔开, 参数键值用等号=连接,然后参数之间用连接符&拼接起来




username=后面跟的是账号
password=后面跟的是密码
因此,我们根据上面说的思路,把万能账号填进去,密码随便填,构造一下,复制
check.php?username=a' or true %23& password=1
然后填进Load URL得出的网址后面,点击Execute执行
解释:%23是#的 URL 编码形式,表示普通字符#, 在 URL 中,某些字符有特殊含义,需要使用URL 编码(即百分号编码)来表示, 类似于进制统一一样,为了避免不必要的麻烦,我们通常都把格式统一一下,
以下字符在 URL 中可直接使用,无需编码:
字母:a-z、A-Z
数字:0-9
部分符号:-、_、.、~
但是遇到特殊字符的时候,最好去查一查看下要不要转变成URL
得出flag
