注入原理:
mysql基础已经有了一定了解了,sql注入差不多就可以看懂了
所以什么是sql注入?我自己的总结就是突破开发者写的查询数据库语句中的漏洞,从而实现对目标数据库中信息的读取,这种读取是非授权的,开发者只让你看a,而sql注入可以实现看a,b,c,d甚至整个数据库中的内容。
比如:开发者写了一个后台登录页面,语句是这么写的,当然实际的网站要比这复杂的多
select 变量password from admin where id = '变量username';
你在登录时里面的变量username和变量password是你自主可控的,当你输入你的用户名admin密码123456,语句就会变成
select 123456 from admin where id = 'admin';
这时候语句就会被发个目标服务器执行从admin表中查询id列admin对应的password的值是否为123456,不是就会回显密码错误
如果你在用户名输入框写admin' union select * from admin;#那么数据库被执行的语句就变成了
select 123456 from admin where id = 'admin' union select * from admin;#';
可控的id = 'admin'被 ' 闭合了,这时候后面写上联合查询union语句最后加一个#注释符把后面影响执行的注释掉,这时候就会发现mysql不仅查询了用户名为admin的数据对应密码是否为123456,并且查询了admin表下的所有数据,而这个页面是后台登录页面,对应的admin表下存储的都是后台的管理员账户信息,包括密码!这样我就拿到了所有后台用户的登录信息,那么这样我就可以任意登录后台了
这就是我理解的原理,通过'闭合sql语句,是否使用'要自己进行判断,也可能是其他闭合符号,之后根据mysql特性合理构造新的注入语句,越过开发者对此处功能的限制,查询数据库中其他敏感信息,只要发现了这个注入点并且可以成功执行构造的sql语句那么基本就可以实现对整个数据库的查询了,比如我还想查这个mysql数据库中是否存储了其他网站的数据,就可以尝试查询information_schema下的表,想要什么查什么。不过这个需要发现的注入点使用的是root用户对mysql数据库进行操作才可以,现实中一般不会有这种情况了,不过查询这个网站对应数据库下的所有内容一般是可以实现的
原理就是这样,不过现实中开发者会进行过滤比如屏蔽union这个字符串等,那么注入就需要使用其他语句了,关键就是发现注入点,其他交给工具,使用工具的前提是理解注入原理,然后尝试构造payload
盲注:
原理理解了就是实践,可是一实践发现,有些注入点根本不会显示任何东西,没有任何反应,而显示东西的可能存在注入点的地方过滤都比较严格没法注入,这咋办?
前端没回显就G了吗?卷铺盖跑路吧。
这时候就要尝试盲注了,何为盲注?就是前端没有回显,通过一些技巧去尝试,判断注入语句是否被目标网站执行了,从而确定注入点
报错盲注:
开发者在写程序时开启了错误日志,当sql语句有错误时会显示错误,从而确定注入语句是否被执行
floor,updatexml,extractvalue等类型
我还是个小白,这种语句不会写,请参考大佬文章
https://www.jianshu.com/p/bc35f8dd4f7c
https://www.cnblogs.com/impulse-/p/14227189.html
也不用写,用的之后直接ctrl+cv根据实际情况改一下就行了,有报错则存在注入点
布尔盲注:
通过加入判断语句,数据库执行时执行成功或错误可能会有回显,这样就可以发现注入点
regexp,like,ascii,left,ord,mid等类型
and length(database())=5; #判断数据库名长度是否为5
and left(database(),1)='a'; #取数据库名第一个字符,判断是否为a
and left(database(),2)='ad'; #取数据库名前两个字符,判断是否为ad
and substr(database(),3,2)='mi';#取数据库名第3个字符开始截取两个字符判断是否为mi
and ord(left(database(),1))=97; #取数据库名第1个字符转为ascii,判断是否为a(a的十进制accii为97)
仅供参考,根据实际来
延时盲注:
通过延时执行sql语句,观察其执行速度,判断注入语句是否被执行,比如原来执行只需要1s,加入3s的延时,如果大约过了4秒成功响应了,这就代表执行成功了,当然这是没有回显的,通过感觉判断,判断不出来调整一下延时值就可以了
and sleep(3); #延时3s执行
and if(1>2,sleep(1),0); #判断1是否大于2,不成立返回0,没有延时执行
and if(1<2,sleep(1),0); #判断1是否小于2,成立,延时1s执行
太多东西了根本记不住哇,理解之后用的时候查一下就好了,幸好考试不考这些东西。