班级:1518011
姓名:于沂渭
学号:151801100005
一.安装mysql
1.0首先查看是否安装mysql
sudo netstat -tap | grep mysql
没有结果,则安装MySQL
1.1安装MySQL
sudo apt-get install mysql-server
sudo apt isntall mysql-client
sudo apt install libmysqlclient-dev
安装过程中出错
dpkg:错误:无法新建文件 '/var/lib/dpkg/info/format-new': 没有那个文件或目录
E: Sub-process /usr/bin/dpkg returned an error code (2)
解决
逐级查找目录,发现没有info目录,mkdir解决
1.2检查安装结果
sudo netstat -tap | grep mysql
PS:在安装过程需要设置数据库密码(在键盘输入数字时不要在右边的1234567890上按数字,那里的0代表ins,要在键盘上面按1234567890)
二,创建搭建 mysql 数据库
建立数据库 test ,数据表 student ,包含 id 、 name 、 score 三列
2.1.登陆mysql数据库
mysql -u root -p
-u 表示选择登陆的用户名, -p 表示登陆的用户密码,上面命令输入之后会提示输入密码,此时输入密码就可以登录到mysql
2.2创建数据库
创建数据库
mysql> create database test;`
使用数据库
use test
创建表
插入数据
3. 编写带有 sql 注入漏洞的接口程序
3.1根据输入的参数值,拼接 SQL 查询语句并执行,将查询结果展示。如根据输入的学号展示姓名和分数。
3.2根据输入的参数值,拼接 SQL 查询语句并执行,展示查询结果是否为空。如输入学号,展示是否有该学生存在。
3.3根据输入的参数值,拼接 SQL 查询语句并执行,将查询结果是否为空展示在两段随机内容之间
3.4根据输入的参数值,拼接 SQL 查询语句并执行,但展示一个固定的结果。如如输入学号,查询是否有学生存在,然后输出固定内容
3.6据输入入的参数值,拼接SQL语句句并执行行行,更更新数据库。如输入入学号和分数,将对应学生生的分数更更新
4. 针对上述各个应用接口,手工修改请求参数,尝试各种 SQL 注入的攻击向量,和正常访问的对照组一起,观察结果并记录。
4.1 根据输入的参数值,拼接 SQL 查询语句并执行,将查询结果展示。如根据输入的学号展示姓名和分数。
正常访问仅显示一条数据,而通过MySQL查询语句拼接可显示全部数据,此处可进行 Union 注入
4.2 根据输入的参数值,拼接 SQL 查询语句并执行,展示查询结果是否为空。如输入学号,展示是否有该学生存在。
通过拼接MySQL查询语句,可查询到数据表中全部数据的情况,由此可推出数据表中的数据量有3个
4.3 根据输入的参数值,拼接 SQL 查询语句并执行,将查询结果是否为空展示在两段随机内容之间。
注入方法类似与上条,可以查询到数据库在数据量
4.4 根据输入的参数值,拼接 SQL 查询语句并执行,展示查询结果的条件表达式结果,并将结果展示在两段随机内容之间。如入学号,展示该学生分数是否大于 60 。
注入方法类似与上条,因为输出内容为布尔型,可使用布尔注入
4.5 根据输入的参数值,拼接 SQL 查询语句并执行,但展示一个固定的结果。如如输入学号,查询是否有学生存在,然后输出固定内容。
注入方法类似与上条,因为输出内容固定,可使用基于时间的注入方法
5. 针对上述各个应用接口, 用 Sqlmap 尝试各种注入方式,并用 Wireshark 抓包,记录每次的目标、SQL 命令行、结果(包括出结果的过程、和最终的输出)、和抓包文件。
sql安装
5.1 根据输入的参数值,拼接 SQL 查询语句并执行,将查询结果展示。如根据输入的学号展示姓名和分数。
使用Sqlmap注入
根据返回结果可判断此接口可通过 boolean-based、time-based、UNION query 方法注入
然后,使用 Wireshark 抓包,过滤规则:
ip.src eq 127.0.0.1 and http.request.method == GET
选择其中一个攻击向量 urldecode
/student/search.php?id=001%28%22%2C%2C%28%29.%29%28%27
decode 后
/student/search.php?id=001(",,().)('
5.2 根据输入的参数值,拼接 SQL 查询语句并执行,展示查询结果是否为空。如输入学号,展示是否有该学生存在。
使用 Sqlmap 注入
由此可以判断无法使用NULL值注入
最终可判断此接口可通过 boolean-based、time-based 方法注入,较上一个接口缺少了 Union query 方法,因为此接口返回值为布尔型返回值
然后,使用 Wireshark 抓包,过滤规则:ip.src eq 127.0.0.1 and http.request.method == GET
选择其中一个攻击向量 urldecode
"/student/search.phpid=-1273%20UNION%20ALL%20SELECT%20CONCAT%280x716a627071%2C0x4558737052456d564a6b%2C0x7170717071%29%2CNULL%2CNULL--%20LpWE"
decode 后
"/student/search.php?id=-1273 UNION ALL SELECT CONCAT(0x716a627071,0x4558737052456d564a6b,0x7170717071),NULL,NULL-- LpWE"
Sqlmap 尝试 Union query 注入,但没有成功。
5.3 根据输入的参数值,拼接 SQL 查询语句并执行,将查询结果是否为空展示在两段随机内容之间。
使用 Sqlmap 注入
可判断此接口可通过 boolean-based、time-based 方法注入,较上一个接口缺少了 Union query 方法,因为此接口返回值为布尔型返回值
然后,使用 Wireshark 抓包,过滤规则:ip.src eq 127.0.0.1 and http.request.method == GET
选择其中一个攻击向量 urldecode
"GET /student/search.php?id=15180110007%20ORDER%20BY%201--%20VPuP HTTP/1.1\r\n"
decode 后
"GET /student/search.php?id=15180110007 ORDER BY 1-- VPuP HTTP/1.1\r\n"
Sqlmap 尝试 ORDER BY 语句用于根据指定的列对结果集进行排序。
5.4 根据输入的参数值,拼接 SQL 查询语句并执行,展示查询结果的条件表达式结果,并将结果展示在两段随机内容之间。如入学号,展示该学生分数是否大于 60 。
与上个接口结果类似,不作赘述
5.5 根据输入的参数值,拼接 SQL 查询语句并执行,但展示一个固定的结果。如如输入学号,查询是否有学生存在,然后输出固定内容。
使用 Sqlmap 注入
可判断此接口仅可通过 time-based 方法注入,较上一个接口缺少了 boolean-based、Union query 方法,因为此接口返回值为固定值,仅能通过时延来判断注入结果
然后,使用 Wireshark 抓包,过滤规则:ip.src eq 127.0.0.1 and http.request.method == GET
选择其中一个攻击向量 urldecode
"GET /student/search.php?id=15180110007%29%3BSELECT%20PG_SLEEP%285%29-- HTTP/1.1\r\n"
decode 后
"GET /student/search.php?id=15180110007);SELECT PG_SLEEP(5)-- HTTP/1.1\r\n"
Sqlmap 尝试使用 SLEEP 语句通过时延来判断注入结果。
5.6 根据输入的参数值,拼接SQL查询语句并执行,更更新数据库。如输入入学号和分数,将对应学生生的分数更更新。
使用 Sqlmap 注入
可判断此接口仅可通过 boolean-based 方法注入,较上一个接口缺少了 time-based、Union query 方法
然后,使用 Wireshark 抓包,过滤规则:ip.src eq 127.0.0.1 and http.request.method == GET
选择其中一个攻击向量 urldecode
"GET/student/update.phpid=%28SELECT%20%28CASE%20WHEN%20%2890%3D61%29%20THEN%206895%20ELSE%206895%2A%28SELECT%206895%20FROM%20INFORMATION_SCHEMA.PLUGINS%29%20END%29%29&score=88%27%2C%20name%20%3D%20%27Richard HTTP/1.1\r\n"
decode 后
"GET /student/update.php?id=(SELECT (CASE WHEN (90=61) THEN 6895 ELSE 6895*(SELECT 6895 FROM INFORMATION_SCHEMA.PLUGINS) END))&score=88', name = 'Richard HTTP/1.1\r\n"
Sqlmap 尝试使用 SELECT 语句注入。
6. 分析抓包文件,了解攻击向量,体会各种注入技术的原理。并回到 4 步骤中手动尝试。
抓包文件已放在附件