sql注入之新手入门示例详解
<p><span><strong>前言</strong></span></p>
<p>
在学习这篇文章之前,至于要学习了SQL注入的前提知识,可以参考之前写的一篇sql注入之必备的基础知识。</p>
<p>
<span><strong>认识SQL注入</strong></span></p>
<p>
最开始就从最简单的开始,进入到less-1开始我们的SQL注入学习之旅。</p>
<p>
通过改变<code>http://localhost/sqlilabs/Less-1/?id=3</code>的id值,页面上呈现不同的内容(username,password)。</p>
<p>
那么我们就可以猜测在后台中的SQL语句就是根据前台传入的id值来去对应的数据。</p>
<p>
<strong>那么SQL语句的写法为:</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_108462">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql keyword">select</code> <code class="sql plain">username,</code><code class="sql keyword">password</code> <code class="sql keyword">from</code> <code class="sql keyword">table</code> <code class="sql keyword">where</code> <code class="sql plain">id=input</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<span><strong>判断存在SQL语句</strong></span></p>
<p>
接下来进行做测试,使用以下的语句进行测试:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_937530">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql plain">http://localhost/sqlilabs/Less-1/?id=3 </code><code class="sql color1">and</code> <code class="sql plain">1=1</code>
</div>
<div class="line number2 index1 alt1">
<code class="sql plain">http://localhost/sqlilabs/Less-1/?id=3 </code><code class="sql color1">and</code> <code class="sql plain">1=2</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
这个时候页面没有任何的变化,这是不和符合我们预期的结果,因为当<code>id=3 and 1=2</code>时,SQL语句变为<code>select username,password from table where id=3 and 1=2</code>页面应该不会有内容。</p>
<p>
<span><strong>确定存在SQL语句</strong></span></p>
<p>
使用了之前的语句不行之后,我们使用如下的语句:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_34224">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql plain">http://localhost/sqlilabs/Less-1/?id=3'</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
当URl是以上的SQL语句时,页面上显示SQL执行错误信息<code>You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''3'' LIMIT 0,1' at line 1</code>。</p>
<p>
<span><strong>其中最关键的错误信息是:</strong></span></p>
<p>
<code>''3'' LIMIT 0,1'</code></p>
<p>
最外层的引号是mysql出错时自动加上的。那么实际的SQL语句是 <code>'3'' LIMIT 0,1</code>。我们发现在我们输入的3'被引号包围了,那么我们之前猜测的<code>select username,password from table where id=input</code>有误,实际的后台的SQL语句应该为:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_240676">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql keyword">select</code> <code class="sql plain">username,</code><code class="sql keyword">password</code> <code class="sql keyword">from</code> <code class="sql keyword">table</code> <code class="sql keyword">where</code> <code class="sql plain">id=</code><code class="sql string">'input'</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<span><strong>SQL注入验证</strong></span></p>
<p>
在确定存在了SQL注入之后,同时知道了后台SQL写法,那么此时我们就可以注入自己的SQL注入的代码。</p>
<p>
由于我们可以控制id的值,那么最终输入的SQL语句会变为:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_493102">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql keyword">select</code> <code class="sql plain">username,</code><code class="sql keyword">password</code> <code class="sql keyword">from</code> <code class="sql keyword">table</code> <code class="sql keyword">where</code> <code class="sql plain">id=</code><code class="sql string">'input 攻击代码'</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
此时我们就可以构造如下的payload来验证我们的想法。由于我们的输入是被一对单引号包裹的,所以我们输入的语句必须要能够不被单引号影响。要么闭合单引号,要么注释掉单引号。(可以参考前面的文章)</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_811838">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql plain">#闭合单引号</code>
</div>
<div class="line number2 index1 alt1">
<code class="sql plain">id=1 </code><code class="sql color1">and</code> <code class="sql string">'1'</code> <code class="sql plain">= '1 # </code>
</div>
<div class="line number3 index2 alt2">
<code class="sql plain">#注释单引号</code>
</div>
<div class="line number4 index3 alt1">
<code class="sql plain">id=1 </code><code class="sql color1">and</code> <code class="sql plain">1=1 # 或者 id=1 </code><code class="sql color1">and</code> <code class="sql plain">1=1</code><code class="sql comments">--+</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
当我们使用上面的这3个payload之后,页面显示的结果是符合预期的。那么我们也可以确定id参数确实是存在SQL注入的。后台的SQL语句的写法也的确是<code>select username,password from table where id='input'</code>。</p>
<p>
在确定了SQL语句之后,接下里就是注入SQL注入代码了。</p>
<p>
<span><strong>执行SQL注入</strong></span></p>
<p>
使用SQL语句来进行脱裤,这一点是十分关键的。如果仅仅是知道存在SQL注入但是无法脱裤,那么实际上这个漏洞对于该网站的危害性还是很小的。如何构造正确的SQL语句进行脱裤,这一点也是十分重要的,在下一篇文章中将会详细地讲解SQL注入的详细的步骤。</p>
<p>
<span><strong>注入类型判断</strong></span></p>
<p>
在本题中的SQL语句就称之为字符型的SQL注入,因为我们的输入在SQL语句执行的过程中被单引号所包括,其实在SQL语句执行中,这个id参数被当做是一个字符类型的数据。除了有字符型的SQL注入,当然还有数字型的SQL语句。那么如何区分这两者呢?</p>
<p>
<span><strong>字符型SQL注入</strong></span></p>
<p>
在确定存在SQL语句这节中,当我们输入<code>id=3'</code>是页面的出错信息是 <code>'3'' LIMIT 0,1</code>。我们发现3'被引号所包围,那么说明这个就是一个字符型的SQL注入了。</p>
<p>
<span><strong>数字型SQl注入</strong></span></p>
<p>
在less-2中,当我们同样输入<code>id=3'</code>时,页面的出错信息是<code> ' LIMIT 0,1</code>,那么就说明是一个数字型的注入了同时还存在<code>limit</code>关键字,那么我们猜测less-2中的SQL注入为:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_837094">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql keyword">select</code> <code class="sql plain">username,</code><code class="sql keyword">password</code> <code class="sql keyword">from</code> <code class="sql keyword">table</code> <code class="sql keyword">where</code> <code class="sql plain">id=input limit 0,1</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
以上都可以通过查看源代码的方式来进行验证。</p>
<p>
<span><strong>SQL语句判断</strong></span></p>
<p>
但是很多时候我们通过单引号的方式并不能返回sql执行语句的错误信息,就无法通过错误信息得到注入类型。因为很多时候在后台的SQL语句会有各种千奇百怪的写法。</p>
<p>
在less-3和less-4中的写法就是如下:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_444310">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql plain">$sql=</code><code class="sql string">"SELECT * FROM users WHERE id=('$id') LIMIT 0,1"</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
在less-3中使用了括号来包裹用户的输入</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_777908">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="sql plain">$id = </code><code class="sql string">'"'</code> <code class="sql plain">. $id . </code><code class="sql string">'"'</code><code class="sql plain">;</code>
</div>
<div class="line number2 index1 alt1">
<code class="sql plain">$sql=</code><code class="sql string">"SELECT * FROM users WHERE id=($id) LIMIT 0,1"</code><code class="sql plain">;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
在less-4中使用了双引号来包裹用户的输入,那么当你即使加上了单引号进行测试的时候还是无法出发SQL语句执行错误。</p>
<p>
所以说很多时候仅仅使用单一的符号进行判断是完全不够的,要多使用不同类型的符号来进行测试的判断,使用包括',",\,(,=,&等等字符,甚至有时候还要使用其他的探查方法,因为你无法判断后台的SQL语句的写法,而且目前很多的网站开发人员已经有了一定的安全意识,可能常规的SQL探查语句也无法使用。关于其他跟多SQL注入的探查语句,网上有很多的资料。</p>
<p>
<span><strong>总结</strong></span></p>
<p>
SQL注入的判断没有万能方法,只有不断的进行尝试,当你有了一定的经验之后,就会对注入类型有了自觉,同时对于SQL注入的判断也会更快。以上就是这篇文章的全部内容了,如果要对实际的网络中的网站进行安全测试,以上的知识是远远不够的。小编会继续更新更多sql注入的文章,请继续关注。</p>
頁:
[1]