-
-
[原创]《 SQL注入“恩仇录”——(1)》
-
发表于: 2018-10-27 13:41 3588
-
《 SQL注入“恩仇录”——(1)》
hello,大家好 !我是可爱萌新大大星!近期在学习SQL注入,在此大大星把学习SQL injection 过程中,学与悟而得的一些知识和技巧在此分享给大伙儿!(文笔拙劣,技之仍弱,望各路前辈大侠多多指点。)
———————————————————————————————————————————————————————————————————————
本文目录
一 : sql注入的定义
(1):什么是sql注入?
二: sql注入的知识
(1):sql注入产生过程
sql注入的定义
a:百度百科
引用 :所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
b:《SQL注入攻击与防御(第2版) 》
1:构造动态字符串
引用: SQL注入是一种通过操纵输入来修改后台SQL语句以达到利用代码进行攻击的目的的技术。
c: 大大星个人的理解:
SQL注入就是操纵和构造恶意的sql代码,去插入或添加到应用的输入参数中,之后这个参数就变成了包含我们想要的东西的恶意参数。最后这恶意的参数传递给后台的服务器,服务器将恶意参数进行解析,之后将我们想要的东西返回给浏览器展现给我们。
sql注入产生过程
web应用开发人员无法确保在将从Web表单,cookie 及输入参数等收到的值传递给SQL查询(该数据在数据库服务器上执行)之前就对它进行过进行过验证,那么一般都会有SQL注入漏洞。
上一段简单的PHP代码:
//在PHP中动态构造一个SQL语句 $sql = "SELECT * FROM table WHERE field = ' $_GET["input"]'"; //在PHP中执行一条动态构造的SQL语句 mysql_query("SELECT * FROM table WHERE field = ' $_GET["input"]'");
像上面的代码出现的问题就是:用户输入的数据传递给动态构造的语句之前,并没有对数据进行验证,从而将攻击者构造的恶意sql语句作为输入提供给数据库执行。
1:(A)转义字符处理不当
我们知道SQL数据库将单引号(')解析成代码与数据间的分界线:单引号外面的内容是要运行的代码,但单引号引起来的内容是数据。
想想看,我们利用这个条件,去简单地在URL或者Web页面输入会发生什么?
看下面代码就知道发生什么啦。
//在PHP中动态构造一个SQL语句 $sql = " SELECT * FROM table WHERE field = ' $_GET["input"] ' "; //在PHP中执行SQL语句 $result = mysql_query($SQL); //检查数据库返回了多少条记录 $rowcount =mysql_num_rows($result); //迭代返回的记录集 $row = 1; while ($db_field=mysql_fetch_accoc($result));{ if ($row <= $rowcount ) { printf $db_field[$row] . "<BR>"; $row++; } }
可以发现以上代码直接将用户的输入直接传递给了动态构建的SQL语句。
如果我们将一个单引号字符输入URL或者web界面为这样的源代码的时候,就会发生错误,这时候我们可以利用这些错误的信息简单的了解到数据库的一些信息啦。 (可以使用此法简单的快速识别web站点是否受到SQL注入攻击)
出现该错误的原因就是因为 单引号字符被解析成了字符串分隔符。所以在运行执行SQL语句之时在语法上就会错误了(它包含多个字符串分隔符)。
1:(B)类型处理不当
处理数字数据的时候,不需要单引号将数据引起来,如果引起来就被当成了字符串处理。
下面是简单的代码,将用户输入直接传递给动态创建的SQL语句,该脚本接受一个数字参数($userid)并显示该用户的信息。
//在PHP中动态构造一个SQL语句 $sql = " SELECT * FROM table WHERE field = $_GET["userid"] "; //在PHP中执行SQL语句 $result = mysql_query($SQL); //检查数据库返回了多少条记录 $rowcount =mysql_num_rows($result); //迭代返回的记录集 $row = 1; while ($db_field=mysql_fetch_accoc($result));{ if ($row <= $rowcount ) { printf $db_field[$row] . "<BR>"; $row++; } }
所以数据型注入的时候,是不必加单引号的!!
1:(C) 错误处理不当
也就是将详细的内部错误信息(如使用的数据库,错误的代码等)显示给攻击者,这些错误细节不应该被显示,更不应该被攻击者看到。因为这些细节会给攻击者攻击网站提供了重要的线索。看看下面简单的脚本代码段:
if (!$result) { //如果有任何的错误 //检查错误的信息并且显示错误信息 die ('<p>Error: '. mysql_error() . '</p>'); }
PHP中包含一个内置函数 mysql_error ,
mysql_error() 函数定义是:返回上一个 MySQL 操作产生的文本错误信息。
上述的代码段 在得到错误后使用die()函数进行显示。
1:(D) 多个提交处理不当
开发人员认为用户会老老实实的遵循他们设计好的逻辑顺序,在处理第一个表达中对数据进行了验证,而在第二个表单却没有进行认证。所以我们就是可以进行URL的乱序进行请求调用第二个表单,操纵构造且提交恶意参数,从而达到我们想要的攻击。
赞赏
看原图
赞赏
雪币:
留言: