SQL注入

SQL注入原理

SQL注入本质

SQL注入利用Web应用对后台数据库查询语句处理时存在的安全漏洞

  • 设计程序时忽略了对某些字符串的检查
  • 原本程序要执行的代码,拼接了用户输入的数据(嵌入指令)

13.1.1

SQL注入攻击流程

第一步:注入探测

  • 自动方式:使用web渗透测试工具,自动探测
  • 手动方式:手工构造SQL注入测试语句

第二步:信息获取

  • 环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
  • 数据库信息:数据库表,表字段,字段内容等(加密内容破解)

部署SQL注入靶场

安装Web安全渗透测试靶场Pikachu、SQLi-Labs、news

13.1.2

MySQL基础操作和常用函数

连接数据库服务器

连接本机数据库服务

  • mysql [-u 用户名] [-p 密码]

13.1.3

列出有哪些数据库

查询当前MySQL服务器上有哪些数据库

  • SHOW DATABASES;

13.1.4

选择数据库

管理数据库中的表格之前,可以先进入到目标数据库

  • USE 库名
1
2
mysql> use pikachu;
Database changed

列出数据库中有哪些表

进入指定数据库以后,可以查询数据库中有哪些表格

  • SHOW TABLES;
1
2
3
4
5
6
7
8
9
10
11
mysql> show tables;
+-------------------+
| Tables_in_pikachu |
+-------------------+
| httpinfo |
| member |
| message |
| users |
| xssblind |
+-------------------+
5 rows in set (0.00 sec)

列出表中的所有记录

查看表格内容

  • SELECT * FROM [库名.]表名;
1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select * from member;
+----+----------+----------------------------------+------+-------------+-----------------------+-------------------+
| id | username | pw | sex | phonenum | address | email |
+----+----------+----------------------------------+------+-------------+-----------------------+-------------------+
| 1 | vince | e10adc3949ba59abbe56e057f20f883e | boy | 18626545453 | chain | vince@pikachu.com |
| 2 | allen | e10adc3949ba59abbe56e057f20f883e | boy | 13676767767 | nba 76 | allen@pikachu.com |
| 3 | kobe | e10adc3949ba59abbe56e057f20f883e | boy | 15988767673 | nba lakes | kobe@pikachu.com |
| 4 | grady | e10adc3949ba59abbe56e057f20f883e | boy | 13676765545 | nba hs | grady@pikachu.com |
| 5 | kevin | e10adc3949ba59abbe56e057f20f883e | boy | 13677676754 | Oklahoma City Thunder | kevin@pikachu.com |
| 6 | lucy | e10adc3949ba59abbe56e057f20f883e | girl | 12345678922 | usa | lucy@pikachu.com |
| 7 | lili | e10adc3949ba59abbe56e057f20f883e | girl | 18656565545 | usa | lili@pikachu.com |
+----+----------+----------------------------------+------+-------------+-----------------------+-------------------+
7 rows in set (0.00 sec)

数据筛选

结合条件子句筛选部分数据记录

  • SELECT * FROM [库名.]表名 WHERE 条件子句;
1
2
3
4
5
6
7
8
mysql> select username,sex,phonenum,email from member where sex='girl';
+----------+------+-------------+------------------+
| username | sex | phonenum | email |
+----------+------+-------------+------------------+
| lucy | girl | 12345678922 | lucy@pikachu.com |
| lili | girl | 18656565545 | lili@pikachu.com |
+----------+------+-------------+------------------+
2 rows in set (0.00 sec)

比较运算符

  • 比较结果为真,则返回1,为假则返回0
类型 用途 备注
= 等于
!=、<> 不等于
>、>= 大于、大于等于 数值
<、<= 小于、小于等于 数值
IN、NOT IN 在集合中、不在集合中
BETWEEN 在两值之间 数值

多个条件的组合

使用多个条件时,通过逻辑操作进行组合(AND优先级高于OR)

类型 用途
OR 逻辑或
AND 逻辑与
1
2
3
4
5
6
7
8
9
10
mysql> select username,sex,phonenum,email from member where sex='girl' or id<3;
+----------+------+-------------+-------------------+
| username | sex | phonenum | email |
+----------+------+-------------+-------------------+
| vince | boy | 18626545453 | vince@pikachu.com |
| allen | boy | 13676767767 | allen@pikachu.com |
| lucy | girl | 12345678922 | lucy@pikachu.com |
| lili | girl | 18656565545 | lili@pikachu.com |
+----------+------+-------------+-------------------+
4 rows in set (0.00 sec)

模糊查询

使用LIKE语句实现相似性检查

  • 通配符_代表单个不确定字符,%代表0~N个字符
1
2
3
4
5
6
7
8
9
mysql> select username,sex,address from member where address like 'nba%';
+----------+-----+-----------+
| username | sex | address |
+----------+-----+-----------+
| allen | boy | nba 76 |
| kobe | boy | nba lakes |
| grady | boy | nba hs |
+----------+-----+-----------+
3 rows in set (0.00 sec)

注释

MySQL注释分为单行注释和多行注释

类型 用途 备注
# #注释内容 单行
– 注释内容,“杠杠”后需加一个空格 单行
/*……*/ /*
第一行注释内容
第二行注释内容
*/
多行

字符串函数

字符串函数主要用于处理表中的字符串

类型 用途 备注
LENGTH(s) 返回字符串s的字符数
SUBSTR(s,n,len) 从字符串s的n位置截取长度为len的字符串 SUBSTRING() MID()
LEFT(s,n) 返回字符串s的前n个字符
CONCAT(s1,s2…sn) s1,s2等多个字符串合并为一个字符串
GROUP_CONCAT() 同一分组的多个字符串合并为一个字符串
ASCII(s) 返回字符串s的第一个字符的ASCII码
HEX(s) 将字符串s转换为16进制

系统信息函数

返回数据库系统相关信息

类型 用途 备注
VERSION() 返回数据库版本号
DATABASE() 返回当前数据库名
USER() 返回当前用户 SYSTEM_USER()
@@DATADIR 返回数据库路径

其他一些高级使用

类型 用途 备注
IF(expr,v1,v2) 如果表达式成立,返回结果v1;否则返回结果v2
SLEEP(n) 暂停n秒
RAND() 返回0到1的随机数
LOAD_FILE() 读取文件,并返回文件内容 secure_file_priv=