05day_sql _基於client-ip、X-forworded-for注入(4)
阿新 • • 發佈:2020-12-21
程式碼文字
<?php header("Content-type:text/html;charset=utf-8"); $link = mysqli_connect('localhost','root','root','security'); //獲取IP https://www.cnblogs.com/rendd/p/6183094.html function ip() { //strcasecmp 比較兩個字元,不區分大小寫。返回0,>0,<0。 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } // $res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; return $ip; } @$ip = ip(); // $sqlinsert = "insert into access (ip) values ('$ip')"; // mysqli_query($link,$sqlinsert); $sql = "select * from uagents where ip_address = '$ip'"; echo $sql; echo '<br>-------------<br>'; $result = mysqli_query($link,$sql); if ($row = mysqli_fetch_assoc($result)) { echo '您的ip是:'.@$row['ip_address']; }else{ echo '您的ip沒有記錄'; } mysqli_close($link); ?>
分析
而HTTP_REMOTE_ADDR
是不可控的除非是掛代理,所以不能控制HTTP_REMOTE_ADDR
,我們便從第一排判斷切入,發現CLIENT-IP
是可控的,由此進行抓包分析,在包裡面加上client-ip
並給他賦值
此時如果是盲注的話就用order by
查詢裡面有多少個欄位,然後進入注入
把此sql語句放在資料庫中執行,發現有四個欄位,而ip_address所在的第三個欄位就是我們可以注入的點,所以在這裡進行注入
然後在burp中進行驗證
解決了client-ip,現在從X-forworded-for注入
方式與client-ip一樣,但是要把client-ip改為X-forworded-for即可得出結果
只要是HTTP開頭
的都是可控的
如何避免sql注入就帶入正則表示式
,符合的話就返回結果。否則的話就不返回
//正則,返回$res,否則就沒有含義啦
//匹配數字或者.,最少7次,最多15次 比如:1.1.1.1 就是七次;111.111.111.111就是15次
$res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
return $res;
設定好正則後進行測試