设为首页 收藏本站
查看: 1433|回复: 0

[经验分享] 【渗透攻防WEB篇】SQL注入攻击初级

[复制链接]

尚未签到

发表于 2017-7-14 15:01:49 | 显示全部楼层 |阅读模式
  前言
不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一,这里我想问,我们真的了解SQL注入吗?看完本篇文章希望能让你更加深刻的认识SQL注入。
  
目录
  第一节 注入攻击原理及自己编写注入点



  • 1.1、什么是SQL?
  • 1.2、什么是SQL注入?
  • 1.3、SQL注入是怎么样产生的?
  • 1.4、编写注入点
  
第二节 寻找及确认SQL注入




    • 2.1、推理测试法
    • 2.2、and大法和or大法
    • 2.3、加法和减法

  正文



  • 第一节 注入攻击原理及自己编写注入点
  
1.1、什么是SQL?
SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。
1.2、什么是SQL注入?
看起来很复杂,其实很简单就能解释,SQL注入就是一种通过操作输入来修改后台SQL语句达到代码执行进行攻击目的的技术。

1.3、SQL注入是怎么样产生的?
构造动态字符串是一种编程技术,它允许开发人员在运行过程中动态构造SQL语句。开发人员可以使用动态SQL来创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中需要根据不同的查询标准来决定提取什么字段(如SELECT语句),或者根据不同的条件来选择不同的查询表时,动态构造SQL语句会非常有用。
在PHP中动态构造SQL语句字符串:



$query = "SELECT * FROM users WHERE username = ".$_GET["ichunqiu"];
  看上面代码我们可以控制输入参数ichunqiu,修改所要执行SQL语句,达到攻击的目的。
  1.4、编写注入点
为了照顾一下新人,这里先介绍一下涉及到的基础知识:



SQL SELECT 语法
SELECT 列名称 FROM 表名称
符号 * 取代列的名称是选取所有列


WHERE 子句
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
语法
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
  下面的运算符可在 WHERE 子句中使用:
DSC0000.png

  了解了以上基础知识就让我们来自己编写注入点把。
  
第一步:我们使用if语句来先判断一下变量是否初始化



<?php
if(isset($_GET["ichunqiu"])){
}
?>
  第二步:在if语句里面,我们连接数据库。在PHP中,这个任务通过 mysql_connect() 函数完成。



mysql_connect(servername,username,password);
servername        可选。规定要连接的服务器。默认是 "localhost:3306"。
username        可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。
password        可选。规定登录所用的密码。默认是 ""。
  第三步:连接成功后,我们需要选择一个数据库。



mysql_select_db(database,connection)
database        必需。规定要选择的数据库。
connection        可选。规定 MySQL 连接。如果未指定,则使用上一个连接。
  第四步:选择完数据库,我们需要执行一条 MySQL 查询。



mysql_query(query,connection)
query        必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
connection        可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。
  第五步:执行完查询,我们再对结果进行处理



mysql_fetch_array(data,array_type)
data        可选。规定要使用的数据指针。该数据指针是 mysql_query() 函数产生的结果。
array_type        
可选。规定返回哪种结果。可能的值:
MYSQL_ASSOC - 关联数组
MYSQL_NUM - 数字数组
MYSQL_BOTH - 默认。同时产生关联和数字数组
  题外话:我们使用echo将执行的SQL语句输出,方便我们查看后台执行了什么语句。



echo $querry
  最终代码如下:



if(isset($_GET["id"])){
    $con = mysql_connect("127.0.0.1:3306","root","root");
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("ichunqiu",$con);
    $querry = "select * from users where id = " . $_GET['id'];
    $sql = mysql_query($querry,$con);
    $result = mysql_fetch_array($sql);
    echo "<table class='itable' border='1' cellspacing='0' width='300px' height='150'>";
    echo "<tr>";
    echo "<td>id</td>";
    echo "<td>username</td>";
    echo "</tr>";
    echo "<tr>";
    echo "<td>".$result['id']."</td>";
    echo "<td>".$result['username']."</td>";
    echo "</tr>";
    echo "</table>";
    mysql_close($con);
    echo $querry;
}
?>
  MySQL数据库实验环境配置:
代码层工作已经做好,但是在数据库里面,我们还没有ichunqiu这个数据库啊,接下来我就带大家一步步创建数据库,创建表,创建列,插入数据。
  第一步:创建数据库


DSC0001.png



第二步:创建表users和列id,username,password

DSC0002.png



DSC0003.png



第三步:我们插入几条数据

DSC0004.png





同样的道理,大家多插几条数据。到此我们整个任务就完成了。
DSC0005.png



  • 第二节 寻找及确认SQL注入
  
2.1、推理测试法
寻找SQL注入漏洞有一种很简单的方法,就是通过发送特殊的数据来触发异常。

首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个:


  • GET请求:该请求在URL中发送参数。
  • POST请求:数据被包含在请求体中。
  • 其他注入型数据:HTTP请求的其他内容也可能会触发SQL注入漏洞。
  
了解完数据的输入方式,我们接下来再学习数据库错误。这里我们以MySQL为例,其它的请大家自行学习咯。
我们现在参数后面加个单引号,如下图:
   DSC0006.png
  sql语句最终变为



select * from users where id = 1'
  执行失败,所以mysql_query()函数会返回一个布尔值,在下行代码中mysql_fetch_array($sql)将执行失败,并且PHP会显示一条警告信息,告诉我们mysql_fetch_array()的第一个参数必须是个资源,而代码在实际运行中,给出的参数值却是一个布尔值。
我们修改代码在



$sql = mysql_query($querry,$con);下一行加上
var_dump($sql);
  可以发现:
DSC0007.png

  为了更好的了解MySQL错误,我们在



$sql = mysql_query($querry,$con);
  加上



if(!$sql)
    {
        die('<p>error:'.mysql_error().'</p>');
    }
  这样当应用捕获到数据库错误且SQL查询失败时,就会返回错误信息:(我们在参数中添加单引号返回的错误信息)



error:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
  然后借助这些错误,我们这可以推断应该存在SQL注入。还有其他数据库错误信息,以及MySQL其他错误信息,由于篇幅问题就不一一讲解了。
  

2.2、and大法和or大法
页面不返回任何错误信息,我们就可以借助本方法来推断了,首先我们在参数后面加上 and 1=1和and 1=2看看有什么不同

   DSC0008.gif
  可以发现and 1=1 返回了数据,而and 1=2没有,这是由于1=1是一个为真的条件,前面的结果是true,true and true 所以没有任何问题,第二个 1=2 是个假条件, true and false还是false,所以并没有数据返回。


好,讲完and,我们自来看看 or ,or就是或者,两个都为假,才会为假。我们先把id改为5,可以发现id=5是没有数据的。
   DSC0009.png
  可以发现我们加上or 1=1就成功返回了数据,这是因为1=1为真,不管前面是不是假,数据都会返回,这样就把表里面数据全部返回,我们没看见,是因为代码中并没有迭代输出。这样,我们来修改一下代码。



echo "<table class='itable' border='1' cellspacing='0' width='300px' height='150'>";
        echo "<tr>";
        echo "<td>id</td>";
        echo "<td>username</td>";
        echo "</tr>";
        //遍历查询结果
        while ($result = mysql_fetch_array($sql)) {
        echo "<tr>";
        echo "<td>" . $result[0] . "</td>";
        echo "<td>" . $result[1] . "</td>";
        echo "</tr>";
    }
  然后你就可以发现:
DSC00010.gif

  2.3、加法和减法
这里我们需要区分一下数字型和字符串型:


  • 数字型:不需要使用单引号来表示
  • 其他类型:使用单引号来表示
  
综合上述,我们可以发现我们的例子是数字型的,这样我们就可以使用加法和减法来判断了。


加法,我们在参数输入1+1,看看返回的数据是不是id等于2的结果,这里注意一下+号在SQL语句是有特效含义的,所以我们要对其进行url编码,最后也就是%2b。
   DSC00011.png
  减法是同样的道理,不过我们不需要对-号进行url编码了。
DSC00012.gif

  结束语
感谢大家的支持吧,在此我也总结一下前面自己的不足,由于篇幅很长,宽度是到位了,但是并没有深入,也不算详细,所以本篇教程分为了三级即初级、中级、高级。六节来写,既要深度也要宽度,当然我也不是技术大牛,如文中有错误请指出,我会加以改正,谢谢。
  文章首链:http://bbs.ichunqiu.com/thread-9518-1-1.html
  
感谢您的阅读,如果您学到了,请点赞(码字不易)!
  
欢迎热心园友补充!

  作者:zusheng
  
系列文章预告及导航
渗透攻防Web篇-SQL注入攻击中级(状态:更新中)


  • 第三节 利用SQL注入
  • 第四节 SQL盲注利用
  
渗透攻防Web篇-SQL注入攻击高级(状态:更新中)



    • 第五节 避开过滤方法总结
    • 第六节 探讨SQL注入防御技巧


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393814-1-1.html 上篇帖子: Java防止SQL注入(转) 下篇帖子: mysql sql常用语句大全
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表