一则将密码123456加密为2468:<的加密方式

原网站用户名是super,密码是5;<566??,登陆显示密码错误。但是用了super'or'1'='1和密码123456登陆后台,后台里面的管理员和管理员密码部分直接把数据库里的内容显示出来了。

先从长度为一位的密码开始,当密码设置为0时,系统将0替换为1储存进数据库,后续的如下:

0替换为1
1替换为2
....
8替换为9
9替换为:
:替换为;
;替换为<
<替换为?
?替换为@
@替换为A
A替换为B
B替换为C
....
Z替换为[
[替换为\
\替换为]
]替换为^
^替换为_
_替换为`
`替换为a
a替换为b
....
z替换为{
{替换为|
|替换为}
}替换为~
...

上面的算法就是对密码取ASCII的10进制值,然后将将这个10进制值+1然后再换为实际的ASCII字符

不过将ab设为密码时,数据库转换后的密码却不是bc,而是bd,这就纳了闷。同样12会被转化为24,我继续猜想,前面第一位的转换没错的话,第二位应该也是单纯的转换。

由此猜想加密格式应该为:

  1. 假设明文只有1位,那么,密文 = 加密(明文)
  2. 假设明文有2位,那么,密文 = 加密(明文第1位) + 加密(加密(明文第2位))
  3. 假设明文有3位,那么,密文 = 加密(明文第1位) + 加密(加密(明文第2位)) + 加密(加密(明文第3位))
  4. 以此类推

那么假设明文是123456,那么:

密文 = 加密(明文第1位) + 加密(加密(明文第2位)) + 加密(加密(明文第3位)) … + 加密(加密(加密(加密(加密(加密(明文第6位))))))

这样,123456就加密成为2468:<了

为了证实我的猜想,我特意添加了一个密码为123456的用户,后台显示的数据库信息确实是123456被替换成了2468:<