SQL注入常见的web漏洞,形成的主要原因是web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。
像这样我们输入?id=1 我们可以获得id=1的信息 这就是sql注入漏洞,可以通过sql的命令行去后台直接查询信息
原因:在前后端数据的交互中,前端的数据传到后台处理时,没有做严格的判断,导致其传入的数据拼接到SQL语句中,被当成SQL语句的一部分执行,从而导致数据库受损,信息丢失。就是后端对输入没有做出充分的过滤然后对非法的输入做出了反应。
如图所示 当我们输入?id=1时候
就会显示id=的一些具体信息
为了让我更好的理解SQL注入的一些知识,我在网上下载了hackbar这款工具
从这里写命令行比较清晰
然后我们代开源代码的话 就是源码为哦
sql= 'select * from users where id='1 and 1=1 ' limit 0,1",
然后就是注入的时候分为字符型和数字型
查询的时候输入的时候如果 输入1=1的时候正确,输入1=2时候报错的时候说明他是数字型
而当你输入的时候 1=1时候正确 1=2正确的时候一般就玮字符型,因为数字被''这种都东西所包裹住了 字符都是一样的
而且还有其他的方法 比如输入
输入2-1 如果出现的是2的用户的信息 那么就是字符型因为字符型没法检查数字运算
如果给出的是1的用户 那么说明就是数字型的输入 因为数字型的注入可以理解数字的运算
不用加号的原因 是因为有时候加号有可能会被认为是空格
数字型不需要闭合 而 字符型号可以闭合 闭合方式有 ' “ ‘) ")
怎么判断闭合方式 输入1’ 会发现这里提示1‘是异常,说明这里我们多输入了一个’值
我们再在盲注里面进行对比
当我们输入?id= 1‘的时候没有回显 报错
当我输入--+时候就是把后面的 代码全部都注释掉 那么我们可以知道闭合方式为单引号
不需要的语句可以通过 --+或者其他方式将后面代码注释掉或者#号键
什么是注入点,就是可以注入的地方,可以连接数据库的地方
用union 联合查询,需要保证查询的列数和世纪列数相一致,所以我们需要知道有几列,才能周联合查询
这里我们输入?id=1' group by 而不用order by 的原因是因为group by能绕过防火墙的检测
如上图所示我们输入4的时候有报错 那么我们尝试输入3
当我们输入3的时候有成功的输出 所以我们知道有三行
然后我们需要有展占位符
当我们少输入一位的时候就会报错
所以列位置必须占满
而且对于union来说 如果第一个运行成功的话,南无后面的指令将不再运行,所以我们使用
故意让第一个为-1,然后它就会执行后面的查询
位置可以不查询位置,但是不可以不用占位符
先开率字符型还是数字型,如果是字符型的就要考虑是否闭合,在注入 的时候最好使用group by因为能够绕过防火墙之类的设备
当我们想要查找table 的相关的信息
输入table_name 来自 information_schema.tables然后我们能获得一些挂关于数据库的命令
或者我们可以在最后加入 where tables_schema=database()--+ 有时候在最后加入一个函数可以绕绕过防火墙
group_concat()的作用是确保所有查询的信息能放到一行来显示
就可以把我们想获取的信息全部提取出来
报错注入就是构造语句,让错误信息中夹杂可以显示数据库内镕的查询语句
因为有些时候这个成功的输入不会回复任何有用的信息
所以我们需要与引入报错注入
比如我们现在输入一个?id=1'报错,由上图我们可以知道这是个单引号的闭合方式
由此可知我们的列数为3列
我们主要是看报错信息来看有用的信息
我们故意输错database()输入成如图,因为 输入错误,所以我么不能可以通过这个方法获得当前数据库的名称为security
然后就是extractvalue报错注入
其实是来查询XML里面的内容
selct extractvalue(doc,/book/author/aurname') from xml
这是这个函数的查询方式
select extractvalue(doc,/book/author/title')from xml 查询书的名字
报错注入的突破口就是让页面上显示报错。
比如在本例中把查询参数的路径写错,页面上只会显示查询不到内容,但是不会报错。
但是如果把查询参数的格式符号写错,页面上就会提示出报错信息:
在实际的注入过程中,查询的列(比如本例中的doc)是不用管的,随便写就可以。因为我们关注的是后面查询的更重要的东西(database)
0x7e就是~,concat函数是拼接的作用。作用是在执行这条命令时遇到前面的飘号~(0x7e)从而引起报错。
然后我们通过报错来获取我们所需要的
因为摄入量 0x7e是个'号,这个是不符合规定的所以引起了报错
所以能爆出我们所需要的信息
输入这个我们可以爆出表名
updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) 程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
通extractvalue(),输入错误的第二个函数,让第二个函数报错,更改路径的函数
select updatexml(doc,。/book/auther/surname','1') from xml;
怎么利用呢,我们可以在第一个doc,'后面多加一个~然后让路径报错,就可以让回显,
我们拿less6来作比较
物品吗嗯首先应该确定闭合的的方式
如图所示 没有回显
如图所示爆出来了数据库当前的名称
and updatexml(1,concat(0x7e,(select group_concat( table_name) from information_schema.tables where table_schema=database())),3)--+
爆出了表名
我们尝试爆出账户和密码
但是发现只能显示1-30个字符,不能完全的显示
substring控制字符输出
select floor(rand()*2) from information_schema.tables随机报错出现我们需要的值
如果在rand()里面加入0数字,就会导致永久报错,所以可以出现回显
这个函数不是直接的调取命令
比如 select count(*),concat ws('-',(select database()),floor(rand(0)*2)) as a from users group by a;
我们是通过源文件的数据与0相减来实现的 造成键值冲突 就回将你想要的返回来 这里主要是使用键值冲突来造成错误返回的
架构体系是这样的·
报错的能展示64位
当语句输入错误,和正确会有两种状态,
ascii()这个命令
?id=1' and ascii(select database()))=?--+
就是猜测是多少进行布尔注入 比如ascii(substr(select database()),1,1))>=115--+
?id=1' and ascii(subtr('abcd',1,1))>97--+
用文件上传拿webshel
首先我们应该确认数据库是否拥有读写的权限
用show variables like '%secure";
点击实行 写着secure
_file_priv如果后面跟着为空,那么说明咱们对数据库拥有读写权,如果后面有具体的位置,意思是这个数据库只有在那个位置才有读取权限,如果为null,就意思是没有读写权限
intp outfile命令使用的环境 服务器上可以写入文件的文件上的完整路径
他明明不是双引号,却被判定为没有错误,这是因为双引号被夹在两个单引号中间,所以被判定为是正确的
经过试验,我们知道了这个闭合方式为单引号进行闭合
如此图为一句话木马
这里是上传木马
into outfile 是显示插入的位置
然后我们就可以通过webshell工具来连接