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博客