本文最后更新于522 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
二次注入,可以概括为以下两步:
第一步:插入恶意数据 进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据 开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。

1.先注册
盲猜有admin账号
注册admin’ # 密码123(插入恶意语句)

登录账号admin’ #


此时数据库中admin的密码为admin

登录后可以修改账号密码为111(代码会误以为修改的是admin的密码)

此时数据库中admin的密码改为111


登录admin密码111

成功登录admin
解析
比如前面所注册的admin ‘#账号,在注册时,后端对其进行了转义( addslashes() 或者mysql_real_escape_string和mysql_escape_string 等),’#被转义成了其他的东西,所以一次注入无效。
但是在保存进数据库的时候,还是admin ‘#。
那么修改密码时的语句如下:
update users set password=’123′ where username=’admin ‘#’
所以你以为修改的是admin '#的账号,但是数据库理解成要修改密码的账号是admin。