sqli-labs:Less-1
Less-1实验主要是:字符型注入和UNION联合查询注入演示
有一些基本的概念需要学习,这些概念以后肯定还会用到,我对这些概念还算比较清楚,但建议初学者一定要注意,逐步积累。但没有必要一来把所有关于mysql数据库和sql相关的都弄一边,可以一边学习这些漏洞一遍掌握这些概念。
union联合查询注入主要是要利用union这个语句,因此页面上必须有显示位(在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位)
union注入的步骤一般有以下几步:
1、判断注入点
2、判断是整型还是字符型
3、判断查询列数
4、判断显示位
5、获取敏感信息
(在网上有很多讲union注入步骤的文章,这个是我看到最容易理解,以及遇到知识点比较适中的一个)
1、判断注入点
我们再Less1中看到,id将作为参数来使用,因此我们输入http://localhost/Less-1/?id=1,这是看到访问了第一个用户的用户名和密码:
输入 http://localhost/Less-1/?id=1'
这里是在id后面加了一个单引号,这是回显示数据库错误信息,这样就能判断出有注入点。这是一种比较简单的判断,有一些网站是不会有任何访问,后面应该有这样的情况。
2、判断是整型还是字符型
可以输入http://localhost/Less-1/?id=1 and 1=1 和 http://localhost/Less-1/?id=1 and 1=2
这里我们从访问情况看,页面是没有任何变化的,就说明肯定是字符型。
这有一个问题就是为什么就能确定是字符型?其实我们仔细看一下sql语句就比较清楚了。
如果id是字符型,那么构造出来的语句为:
select username, password from users where id='1 and 1=1';
select username, password from users where id='1 and 1=2';
这里由于id是字符型,它只会匹配第1个数字,即1后面的字符都默认忽略了,所以输入任何的都无关。
但是如果id是整型,那么构造出来的语句为:
select username, password from users where id=1 and 1=1;
select username, password from users where id=1 and 1=2;
这里由于id是整型,第二个语句就会返回空。
这里既然我们知道了是字符型,所以我们可以输入这样的查询去看一下返回情况
http://localhost/Less-1/?id=1' and 1=1 %23
http://localhost/Less-1/?id=1' and 1=2 %23
我们就发现第一个语句时正常显示的,第二个语句无任何显示。
这里可能大家注意到%23,这个是html的编码代表 # 号,这时候sql语句构造为:
select username, password from users where id='1' and 1=1 #';
select username, password from users where id='1 and 1=2 #';
"#"号代表注释的意思,因为后面还有一个单引号,不注释了,语句就会报错。注释的方法还有 --+ ,其中 + 号在html编码里代表空格。这里用那两种方式来做注释都行(这里的注释只是mysql的,要注意数据库类型)。
3、判断查询列数
order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次 类推。我们可以通过二分法来猜解列数
输入 order by 4%23 发现页面错误,说明没有4列
输入 order by 4%23 发现页面正常,说明有3列
4、判断显示位
首先要明白union的作用,union是将两个select查询结果合并,我们可以在sqli-labs的数据库中测试一下该语句。sqli-labs中有一张users表在security数据库中。我们在命令行下就能看到:
这里我们测试一下union语句,我们输入select username,password from users where id='1' union select 1,2
我们看到union后面的内容合并到了后面,这里注意合并列数一定要相等。
在页面中能显示的原因,一般是php中使用了mysql_fetch_array函数,该函数的作用是从查询语句中取出第一行来使用。那么这就有一个问题了,如果用上面的语句,无论union后面的查询是什么只能显示第一行,即:
http://localhost/Less-1/?id=1' union select 1,2,3 %23
那现在我们只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了,我们把语句改为:
http://localhost/Less-1/?id=-1' union select 1,2,3 %23
这里id一般不会为-1,因此第一行查询为空,所以显示第二行,页面就打印出来了。
5、获取敏感信息
到这里我们就可以尝试用union注入来获取敏感信息了。这里我们尝试来获取MySQL的root密码,root密码是保存在数据库mysql下的user表的authentication_string字段中,我们可以构造这样的url:
localhost/Less-1/?id=-1' union select 1, User, authentication_string from mysql.user where User='root' %23
这里我们看到root密码已经被暴露出来了,只不过是经过了加密。可以在 https://www.cmd5.com/ 中试着破解查询一下: