最近系统性的重新学习了一下SQL注入,做个总结让印象更加深刻。
一,什么是SQL注入
个人总结为:通过WEB系统中提供的数据输入入口,利用构造特殊字符串将原SQL语句拼接成实现其他功能的SQL语句,从而实现对原不可见的数据进行操作的目的。
二,SQL注入能做什么
1,在数据库中查询WEB系统本不允许查询的内容
2,在权限允许之外,对数据库内容进行增,删,改,查等
3,通过调用系统函数实现对目标主机的控制和操纵
4,向目标主机写入文件或读取目标主机的特定文件内容
三,SQL注入实现方法
基本思路包括:“管中窥豹”,“断章取义”,“移花接木”,“抛砖引玉”,“无中生有”。
管中窥豹
“窥一斑而知全豹”,通过WEB页面功能,结合输入特殊字符从而猜测出后台SQL语句的内容。
上图中,通过在id=1后面加一个引号,引起报错,从而猜测出SQL语句大概为SELECT * FROM table WHERE id='' LIMIT 0,1。
断章取义
将原本的SQL语句通过单引号,双引号,括号,注释符和制表符等特殊符号进行分割,从而改变原来的意义。
上图中的SQL语句,id为输入参数,可以在输入字符串中填入“ 1’ --+ ”,通过输入的引号将原来的引号闭合,加上--+将后面内容注释掉,成功修改了原语句。
移花接木
通过在SQL语句中接上其他内容,从而实现特定目的。如在上面例子,将输入内容改为“ ?id=-1' union select 1,database(),user() --+ ”,在页面回显的内容里可以知当前数据库名和用户名。
抛砖引玉
在页面无法将所查询内容返回,只返回数据库查询语句错误时,可以通过故意构造错误语法,将想得到的内容通过报错信息返回。下图的例子中,不论id的值是多少,返回的内容都一样,可见显示内容不是来自于查询结果,所以不能直接将构造好的语句查询结果返回。
但当SQL语句出现错误时会有报错。
通过使用Extractvalue()函数,故意引起报错来返回想要的结果。将输入内容改为“ ?id=1' union select 1,2,(extractvalue('s',concat('~',database()))) --+ ”得到了当前数据库名。
无中生有
对于既不返回数据,又不返回错误的WEB,可以通过其反回的成功以及失败的结果判断查询内容是否存在。这种方法业内叫做“盲注”
盲注大体上分为布朗型盲注和时间盲注。
布朗型盲注的特点是WEB页面有返回值,但只返回成功或失败。比如网站登录页面,只会返回登录成功或登录失败。
如下图中的例子,当id值存时,页面显示一个固定的字符串。当id值不存在或语法错误时,什么内容都不显示,这种情况就适合盲注。
时间盲注的特点是页面无返回,但可以在语句中拼接出sleep()函数,假设语句查询有结果则执行sleep,而查询无结果则不执行sleep,根据页面相应时间的不同可以将没有返回值的页面变成布朗型。
盲注只能返回语句执行结果,那么怎么获得数据库中的内容呢?
盲注需要依赖合理的猜测和穷举,例如,我们可以肯定数据库中的内容是字符串,那么由于ASCII码是有范围的,所以可以通过穷举法爆破出内容。但如果对数据库的内容毫无头绪,就没有办法确定爆破所用字典的内容,也就无法成功获得想要的信息了。
盲注的最大意义在于#漏洞存在的更加隐蔽#很容易存在于现有的系统中,如果同时环境中存在着其他不当的配置(如数据库用户权限过大,目录存在写权限等),利用盲注的漏洞将很容易拿到服务器的shell。
总结
学习SQL注入不要被网上的各种分类搞晕,不能只关注方法,学习大神们思路才是真谛,漏洞找不找得到,全看脑洞够不够大。