背景:
“北京交警APP”可以網上辦理進京證,但是最近每次在該APP辦理進京證,總會提示“排隊人數過多”。很是苦惱,想一探究竟,到底是真的排隊過多,偶有成功,還是總會彈出該錯誤提示?
前期准備——抓包:
1.利用fiddler對手機進行抓包,看到一個addcartype接口的302響應和一個錯誤頁面的200響應,這是進入申請進京證排隊20秒的那個接口,直接跳到錯誤頁面。如下
2.詳細分析addcartype接口,這是導致錯誤頁面的關鍵。如下
php實現一個簡單的灌水程序
1. 每隔一秒訪問該接口,如果HTTP響應碼為302,則繼續灌它。
2. 每隔一小時統計接口302訪問次數
3. 如果狀態碼為200,則記錄返回數據。好進行申請進京證的下一步。
代碼見下,開發這個灌水純粹是腦子一熱,邏輯如有紕漏請指正。
<?php /** * Created by PhpStorm. * User: wanghejun_iwm * Date: 2017/6/2 * Time: 15:56 */ set_time_limit(0); $url = "https://api.jinjingzheng.zhongchebaolian.com/enterbj/platform/enterbj/addcartype"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); //設置header $header = array(); $header[] = "Content-Type: application/x-www-form-urlencoded"; $header[] = "Origin: https://api.jinjingzheng.zhongchebaolian.com"; $header[] = "Cookie: JSESSIONID=03451CCEFCA2975A892618509F49EB2A; CNZZDATA1260761932=1447194544-1489704663-https%253A%252F%252Fapi.jinjingzheng.zhongchebaolian.com%252F%7C1494198185; UM_distinctid=15ab66a50aa19-0ebf95ce9e49a4-2e5e056a-3d10d-15ab66a50ab7c"; $header[] = "Content-Length: 182"; $header[] = "Connection: keep-alive"; $header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; $header[] = "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89"; $header[] = "Referer: https://api.jinjingzheng.zhongchebaolian.com/enterbj/jsp/enterbj/index.jsp"; $header[] = "Accept-Language: zh-cn"; $header[] = "Accept-Encoding: gzip, deflate"; curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 檢查證書中是否設置域名 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, true); $data = 'applyid=&carid=馬賽克&userid=馬賽克&gpslon=116.314587&gpslat=40.044848&imei=&imsi=&licenseno=%E5%86%馬賽克&appsource=&hiddentime=2017-06-02+15%3A29%3A52'; curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //data with URLEncode $ret = curl_exec($ch); $httpCode = 302; $n = 0; $currentTime = intval(date("d") . date("H")); while ($httpCode == 302) { $n++; sleep(1); $ret = curl_exec($ch); $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE); $data = curl_multi_getcontent($ch); $now = intval(date("d") . date("H")); if ($now > $currentTime) { $currentTime = $now; //記錄當前為止302次數 $time = date("Y-m-d H:i:s"); error_log("\n 截止到$time ,請求次數 : $n\n" , 3, '/tmp/jinjingzheng'); } if ($httpCode == 200) { error_log("\n 截止到成功 ,請求次數 : $n\n" , 3, '/tmp/jinjingzheng'); error_log("\n 返回信息 : \n" . print_r($data, true), 3, '/tmp/jinjingzheng'); } } curl_close($ch);
后台運行灌水小程序
php JinjingEnter.php &
后續改進
1. 對/enterbj/platform/enterbj/addcartype進行灌水,得到返回信息,查看是亂碼。
原因:返回信息未進行gzip解碼,需要在代碼中加入一行
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); //解釋gzip內容
2. 亂碼問題解決,返回信息為一個頁面,down下來 本地打開,發現樣式、圖片都加載不到,如下圖
原因:查看html源碼,發現未進行資源替換。里面的樣式文件以及url請求都用的uri段形式,如下
/enterbj/static_resources/enterbj/images/img_cz.jpg
所以需要爬蟲代碼繼續改造,替換起始段位 /enterbj/ 為 https://api.jinjingzheng.zhongchebaolian.com/enterbj/
line58代碼改成如下,並注入到一個html文件中。
$data = preg_replace('/(\'|\")\/enterbj/', '$1https://api.jinjingzheng.zhongchebaolian.com/enterbj', $data); error_log($data, 3, '/tmp/jinjing.html');
以下為得到的二級頁面,核驗環保等級頁面。由於已轉換成web頁面,我們可以通過chrome 調試查看請求。
點擊“核驗環保等級”Button,請求信息如下
發現在這一層又是遇到麻煩了,直接拋出無情的404.后轉換成get直接請求該鏈接。發現該接口不支持get請求,所以說更加斷定是對方服務器動了手腳,處理請求的時候直接甩出404
所以說這個接口也需要灌水,直到沒有404,得到正確返回信息。綜合,改造代碼如下
首先封裝一個http請求函數
/** * 發送http/https請求 * @param string $url 請求url * @param array $header 數組header * @param $body 請求體 * @param int $trueCode 特判正確碼 * @param bool $isPost 是否post請求 * @param bool $isHttps 是否https請求 */ function sendHttp($url = " ", array $header, $body = null, $trueCode = 200, $isPost = true, $isHttps = true) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); if (true == $isHttps) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 檢查證書中是否設置域名 } if (true == $isPost) { curl_setopt($ch, CURLOPT_POST, true); if (!is_null($body)) { $data = is_array($body) ? http_build_query($body) : $body; curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); $httpCode = 0; $n = 0; while ($httpCode != $trueCode) { $n++; sleep(1); $ret = curl_exec($ch); $httpCode = curl_getinfo($ch,CURLINFO_HTTP_CODE); $data = curl_multi_getcontent($ch); if ($httpCode == 200) { error_log("\n 截止到成功 ,$url 請求次數 : $n\n" , 3, '/tmp/jinjingzheng'); echo "\n"; $data = preg_replace('/(\'|\")\/enterbj/', '$1https://api.jinjingzheng.zhongchebaolian.com/enterbj', $data); $filename = "/tmp/" . end(explode('/', $url)) . ".html"; if (file_exists($filename)) { unlink($filename); } file_put_contents($filename, $data); } else { error_log("\n $url 請求次數 : $n ,返回碼 :$httpCode\n " , 3, '/tmp/jinjingzheng'); } } curl_close($ch); return true; }
其次,對核驗環保等級接口灌水
$header2 = array(); $header2[] = 'Accept:application/json, text/javascript, */*; q=0.01'; $header2[] = 'Accept-Encoding:gzip, deflate, br'; $header2[] = 'Accept-Language:zh-CN,zh;q=0.8'; $header2[] = 'Connection:keep-alive'; $header2[] = 'Content-Length:137'; $header2[] = 'Content-Type:application/x-www-form-urlencoded; charset=UTF-8'; $header2[] = 'Host:api.jinjingzheng.zhongchebaolian.com'; $header2[] = 'Origin:null'; $header2[] = 'User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36'; $url2 = 'https://api.jinjingzheng.zhongchebaolian.com/enterbj/platform/enterbj/checkenvgrade'; $body2 = '馬賽克'; sendHttp($url2, $header2, $body2);