sql注入学习

sql注入发生在服务端服务器向数据库请求数据的时候

是否存在sql注入,sql注入漏洞的产生需要满足以下两个条件。
(1)参数用户可控:前端传给后端的参数内容是用户可以控制的。
(2)参数代入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。

满足就有可能产生sql注入

sql注入分为三大类型:可回显的注入、不可回显的注入、二次注入

可回显的注入:联合注入、报错注入

不可回显的注入:Bool盲注、时间注入

注释可以是 --  和  #

一、information_schema(重要)

information_schema

information_schema数据库是MySQL数据库自带的数据库,里面存放的MySQL数据库所有的信息,包括数据表、数据注释、数据表的索引、数据库的权限等等。

简而言之,若想知道mysql中有哪些库,哪些表,表里面有哪些字段以及他们的注释,都可以从information_schema中获取(具体还有其他的一些如schema(schemata、schemas 这两个都是schema的复数)、tables、columns等可以自行学习)

二、 判断注入点

判断该url是否存在sql注入,如果存在sql注入那么属于那种注入就很重要了,只有我们知道是哪种类型才能构造原始sql语句

不管它是整型还是字符串类型用  ’  都好使 ,报语法错误,极大概率有sql注入漏洞 

select * from user where id = 1 and 1=1

构造sql语句也可以判断是数字类型还是字符串类型,如上的话就是条件都是数字类型,如果有回显说明肯定是数字类型,如果不是肯定是后面 1=1 出现问题 

要判断SQL注入是数字型还是字符串型,可以通过以下几种方法:

1. 观察注入点的上下文:观察SQL语句中注入点的上下文,如果注入点周围的代码逻辑表明该注入点应该是一个数字,那么很可能是数字型注入;如果注入点周围的代码逻辑表明该注入点应该是一个字符串,那么很可能是字符串型注入。

2. 使用正则表达式匹配:通过使用正则表达式匹配注入点的值,可以判断注入点的值是否符合数字型或字符串型的格式。例如,可以使用`\d+`匹配数字,使用`'[^']*'`匹配字符串。

3. 使用SQL注入测试工具:使用专门的SQL注入测试工具,如SQLMap,可以自动识别注入点的类型。这些工具通常会尝试不同类型的注入攻击,包括数字型和字符串型注入,然后根据攻击的结果来判断注入点的类型。

需要注意的是,判断注入点的类型只是为了更具针对性地构造注入攻击,实际上对于防御SQL注入来说,并不需要判断注入点的类型,而是要使用参数化查询或编写安全的SQL查询来防止注入攻击。

三、无列名注入(联合查询)

联合查询的用法,连接select语句并返回

union select 没回显用不了,有回显可以用来试字段数,根据它的报错判断(可以右键检查中的network下的response中看到,headers中可以取到url(注入地址)和请求的字段)


例如:select * from test union select 1;

select * 的原因是不清楚有多少字段,全部查然后用union select 试


还可以用order by (如 select * from sqli where id=1 order by 1,2,3...)看看有没有回显,有多少回显有多少字段

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。

ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

order by

SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
  • column1, column2, ...要排序的字段名称,可以为多个字段。
  • ASC:表示按升序排序。
  • DESC:表示按降序排序。

可以结合一些函数回显出有用信息

select xxx

  • database();  查询出当前选择的数据库
  • version();  版本
  • user();  查看当前登入数据库的用户
  • now();  时间
  • @@datadir;  查看数据路径
  • @@basedir;  查看mysql安路径
  • @@version_compile_os;查看mysql安装的系统
  • 也可以直接获取如column_name

一般要获取的重要字段如 host、user、password等 

先找库,然后union select 找到字段数,然后替换成user() version(),然后根据已知的库去查表有哪些字段,然后获取需要信息

database() 找到库,然后搜寻表,然后找表里的字段


当union select中依旧只返回1条或固定条数说明加了limit限制

如 select * from 'products' where 'category' = 'gifts' limit = 1;

limit a,b  从第a+1个数开始拿b个

limit 可以帮助我们从只显示一条数据,到一个个拿出来

但是更建议使用select concat(0x7e,databse(),0x7e)的方式一次性拿出来


group_concat(content) 将信息和并成一条显示

如:select group_concat(login,'@',password) from users

gifts' union select 1,2,3,4  

 四、boolean-base布尔型注入

布尔盲注是一种常见的SQL注入攻击技术,它基于在注入点上构造能够返回布尔值(真或假)的SQL语句。通过这种技术,攻击者可以逐步推断数据库中的数据,表结构以及其他敏感信息。

攻击者通常会尝试构造一个SQL语句,在其中通过条件判断来验证某个条件是否成立。

特点:题目的返回显示是正确或错误,据此推断

girts' or 1 = 1 #

在这个例子中,如果数据库返回了正常的查询结果,那么攻击者就可以得知条件成立;如果查询结果为空或者出现错误,那么攻击者就可以得知条件不成立。

通过不断尝试不同的条件和查询,攻击者可以逐步推断出数据库中的数据和表结构,最终实现对数据库的非授权访问。

五、time-based基于时间的延迟注入 

 gifts' and sleep(2) 

根据页面反应时间来判断注入点,适用于没有回显,甚至注入语句是否执行都无从得知。 

说明前面的条件为真,sleep才进行,即存在注入漏洞,没有回显可以这么判断
随便输入a'时间没有停顿说明为假或者不存在sql注入
盲注就是没有任何回显,利用sustr(database(),1,1)=' '可以一个个试出库名的第一个字母乃至全库名,1为真,0为假,26个字母。加一些特殊符号
首先要知道库名称的长度,利用时间盲注也能直观的试出来,时间是否停顿便可看出真假


时间盲注多与IF(expr1,expr2,expr3)结合使用,此if语句含义是:如果expr1是TRUE,则if()的返回值为expr2;否则返回值则为expr3。所以判断数据库库名长度的语句为:

if (length(database())>1,sleep(5),1)
上述语句的意思是,如果数据库库名的长度大于1,则MySQL查询休眠5秒,否则查询1。

六、error-based 报错型注入

如果页面能输出sql报错的信息,则可以从报错信息中获得想要信息 

random()   随机产生(0,1) 。random(x) 常写成random(0)随机产生固定的值0~1之间的数

结合 count(*) 和group_by和floor()

报错信息

将‘1’替换成我们想要的

 

注意:数据<3条不会报错。 

还有updatexml()和  extractvalue()    因不符合Xpath格式的字符串而报错

updatexml('XML_document','Xpath_string','New_value')
//即
updatexml('目标xml文件名','在xml中查询的字符串','替换后的值')
 

extractvalue('XML_document','Xpath_string')
//即
extractvalue('目标xml文件名','在xml中查询的字符串') 

如果我们输入的Xpath_string不对就会报错,而如果页面回显sql报错信息就可以得到我们想要的信息了。

一般就写   updatexml(1,concat(0x7e,database()),1)

                 extractvalue(1,concat(0x7e,database()))

此处的XML_document,New_value可以随便填

七、stacked queries

危险系数很大的注入,没有限制sql语句条数,用 ;使得再接sql语句,可以删库。

这可能不能一下掌握,需要一定前置知识,和练习。

绕过技巧
(1)substr函数绕过
left(str,从左边开始截取的位置)
right(str,从右边开始截取的位置)
substring(str,从左边开始截取的位置)
mid(str,index,key)截取str从index开始,截取len的长度
lpad(str,len,padstr) rpad(str,len,padstr)在str的左(右)两边填充给定的padstr到指定的长度len,返回填充的结果
(2)等于号(=)绕过
1.用in()
2.用like
(3)ASCII()绕过
hex() bin() ord()

注:由于人工注入一般耗时较长且繁琐,所以有时会借用工具如sqlmap等,也可以自行写脚本,自动筛选。

waf了information_schema如何做

SQL注入中无法利用information_schema的情况_mysql手工盲注无information_schema-CSDN博客

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值