sql绕过登陆表单
靶机下载地址:https://sourceforge.net/projects/owaspbwa/files/
sql注入是在web端很常见的漏洞,主要是因为对于用户与数据库的操作,没有审查。比如,用户搜索叫做socks的商品,用sql结构化查询语句来检索数据库,使用select
socks from 表名称
对于数据库的操作,一般有 SELECT、INSERT、UPDATE、 DELETE
比如说,在虚拟机的登陆页面输入arst'
\
::: {.image-package}
\
::: {.image-caption}
:::
:::
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 'd41d8cd98f00b204e9800998ecf8427e'' at line 1
页面返回错误提示,at line 1
前面的不是双引号,而是两个单引号哦注意。说明多了单引号引发了sql错误,那么我们该如何利用这个异常呢?
首先,猜测后台的sql语句是
select * from 表名 where user = 'xxx' and password = 'xxx'
它将在数据库的某个地方核对user和password参数是否一致。一致的话,那么值为1,返回进入后的页面;不一致,值为0,返回登陆页面。那么我们的目的要将值为1。除了输入正确的用户名和密码,还有没有其他方法使得值为1呢?有的。
如果sql语句改成这样:
select * from 表名 where user = 'xxx' or '1=1' and password =
'xxx'
我们都知道,or语句,只要一部分正确,就返回true。但是,and比or优先级高,所以,上面的语句就是
user = 'xxx' or '1=1' and password = 'xxx'
相当于 ( user = 'xxx') or( '1=1' and password = 'xxx')
false or (true and false)
结果为false
那怎么改呢?只要or前面的为true,就可以通过验证。
(user = 'admin') or ('1=1' and password = 'xxx')
true or false 通过验证
::: {.image-package}
\
::: {.image-caption}
:::
:::
成功登陆
::: {.image-package}
\
::: {.image-caption}
:::
:::
那怎么知道用户名一定有一个叫做admin的呢?
其实还有第二种方法:
(user = 'xxx' or 1=1) or ('1=1' and password = 'xxx')
true or false 通过验证
用户名输入 xxx'or1=1or'1=1
密码输入 xxx
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 'or1=1or'1=1' AND
password='f561aaf6ef0bf14d4208bb46a4ccb3ad'' at line 1
显示出了sql错误
e,因为1=1没有单引号,所以出错。
-
2017.11.2更新
输入 xxx' or '1=1' or '1=1
密码随意,ok,又进入了登陆页面。**如果空格会被过滤,空格可以替换为/**/**,这是多行注释符号,会被忽略的。
还有方法三:
xxx' or '1=1'#
密码不填,#注释掉后面的语句,OK,又进入了登陆页面
2018.1.21.疑问?从原理上看,sql注入应该很好预防,为什么依然有sql注入这种漏洞广泛存在?
因为数据库厂商(mysql)之类,给了程序员100%的权利,但由于程序员水平问题,程序架构复杂,人数多,导致的问题。
如何解决?指定安全框架,使程序员必须按照安全规范编写程序。
白盒检查,使写出的代码必须符合这个安全框架。
:::
:::
:::