本文主要是介绍客户端伪造代理服务器ip进行sql注入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前几天同事发现网站访问异常慢,经过排查,发现mysql亚历山大。果断查看日志,发现大量这样的查看
# Query_time: 5.019276 Lock_time: 0.000066 Rows_sent: 0 Rows_examined: 1
SET timestamp=1477759063;
update wa_search_record SET keyword_length= '9',s_count= '4916',s_time= '2016-10-30 00:37:35',split_txt= 'index.php',res_count= '2',cid= '0',pid= '0',s_type= '2',
ip= 'aaa' AND (SELECT * FROM (SELECT(SLEEP(5)))oASM) AND 'mZkt'='mZkt, 180.97.106.37',is_all= '2',weight= '4918' where id='52718';
仔细查看代码,发现红色部分是被注入的代码。
开始百思不得其解,这里的作用是保存ip地址,ip地址是服务器函数取的,怎么可能注入呢?
然后找到了这行代码:
$remote_addr=($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];
HTTP_X_FORWARDED_FOR 是当客户端通过代理服务器时的代理服务器增加的保存客户端的ip地址。如果通过代理服务器,REMOTE_ADDR将得到代理服务器ip,而HTTP_X_FORWARDED_FOR得到客户端ip。这样HTTP_X_FORWARDED_FOR值一定是代理服务器发送过来。只要客户端模拟代理服务器构造一个HTTP_X_FORWARDED_FOR就可以注入了。
解决方案1:
拒绝所有代理服务器访问。有点宁可错杀1000不可放过1个的感觉,不可取
解决方案2:
对$ip过滤,只保留ip地址格式的字符串。如果构造这个值并不为了注入,而是伪造ip地址,让你没法通过ip判断区域,会导致业务错误。实际也不可取。
解决方案3:
只使用REMOTE_ADDR,虽然可能不准,但没有安全问题
解决方案2:
只使用REMOTE_ADDR,虽然可能不准,但没有安全问题
这篇关于客户端伪造代理服务器ip进行sql注入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!