ASP代码中MSSQL查询变量拼接空格差异对SQL注入的影响咨询
先看你贴的这段ASP代码:
myUsrName = stripFilter(request.form("user")) myUsrPassword = stripFilter(request.form("password")) sSql = "SELECT * FROM tblCustomers where cust_name='" & myUsrName & "' and cust_password='"&myUsrPassword&"'"
首先得纠正一个常见误区:ASP里&两侧的空格只是代码格式问题,完全不会影响最终拼接出来的SQL字符串内容。也就是说,"cust_name='" & myUsrName & "'"和"cust_password='"&myUsrPassword&"'"这两种写法,拼出来的结果没有任何区别——空格不会被加到最终的SQL里,只是开发者写代码时为了好看加的分隔而已。
不过既然你问了,咱们还是拆解清楚,避免踩坑:
1. 最终生成的SQL完全一致
假设用户输入的user是admin' --,password也是admin' --,那么最终生成的SQL会是:
SELECT * FROM tblCustomers where cust_name='admin' -- ' and cust_password='admin' -- '
不管是myUsrName还是myUsrPassword的拼接,结果里的单引号、变量内容、后续的SQL片段都是紧密连接的,没有因为ASP代码里的空格多出来任何字符。
2. 构造恶意payload时不需要调整空格
你完全不用因为这个写法差异特意修改注入内容,重点只需要关注两个点:
stripFilter的过滤规则:这个函数才是你绕注入的最大障碍,得先搞清楚它过滤了哪些字符(比如单引号、空格、关键字?)- SQL语法本身的空格要求:比如你要写
OR 1=1,这里的空格是必须的,SQL Server不认OR1=1这种写法——但这个和ASP的拼接空格无关,是SQL本身的规则。
举个万能密码的例子,不管是用user还是password字段,输入' OR 1=1--都能正常生成有效的注入SQL:
-- 用user字段的情况 SELECT * FROM tblCustomers where cust_name='' OR 1=1-- ' and cust_password='xxx' -- 用password字段的情况 SELECT * FROM tblCustomers where cust_name='xxx' and cust_password='' OR 1=1-- '
两种情况里--都会把后面的内容注释掉,逻辑完全一样。
3. 有没有需要注意的坑?
唯一的小坑和这个空格无关,是单引号的闭合问题:比如如果你输入的payload开头是UNION SELECT ...而不是' UNION SELECT ...,那不管哪个字段,都会变成cust_name='UNION SELECT ...',这时候整个payload会被当作字符串字面量,注入就失效了——所以必须保证payload开头的'能正确闭合前面的单引号,这一点对两个字段是完全一样的。
说白了,代码里的&空格差异就是开发者的编码习惯,对注入没有任何实质影响,你该怎么构造payload就怎么构造,重点放在绕过stripFilter上就行。
内容的提问来源于stack exchange,提问作者3therk1ll

