闲来无事,玩一玩Linux的curl命令。很简单的需求,携带cookie伪造合法的post请求。
首先还是抄一下curl命令的参数:
语法:# curl [option] [url]
-A/--user-agent <string> 设置用户代理发送给服务器
-b/--cookie <name=string/file> cookie字符串或文件读取位置
-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
-C/--continue-at <offset> 断点续转
-D/--dump-header <file> 把header信息写入到该文件中
-e/--referer 来源网址
-f/--fail 连接失败时不显示http错误
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-r/--range <range> 检索来自HTTP/1.1或FTP服务器字节范围
-s/--silent 静音模式。不输出任何东西
-T/--upload-file <file> 上传文件
-u/--user <user[:password]> 设置服务器的用户和密码
-w/--write-out [format] 什么输出完成后
-x/--proxy <host[:port]> 在给定的端口上使用HTTP代理
-#/--progress-bar 进度条显示当前的传送状态
当然了,上面的还是不够详细,剩下的就留待以后补充了。
言归正传,回到刚才的话题,我的demo是这样的,首先通过curl命令获取到某个网站的cookie,之后携带这个cookie,以及一些参数,在该网站暴露的接口中去提交请求。(不知道这种行为算什么)
步骤如下:
1. 通过curl 直接down下来cookie,使用 '-D' 命令。
nohup curl -D cookie.txt https://zhidao.baidu.com
现在cookie信息就已经写入到了cookie.txt文件中,如下展示。
2. OK,cookie拿到了,就剩下搞破坏了,还是使用本地测试的URL,直接暴露别人的bug也不大厚道。
nohup curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0" -b cookie001.txt -d "a=2660884526" -d "b=2660884526" -d "c=2660884526" http://li.wukong.com/arr.php
php代码如下:
<?php
$headers = getallheaders();
echo PHP_EOL.'HEADER头:'.PHP_EOL;
print_r($headers);
$content = file_get_contents('php://input');
echo PHP_EOL.'访问请求的原始数据的只读流:'.PHP_EOL;
print_r($content);
echo PHP_EOL.PHP_EOL.'POST数据参数:'.PHP_EOL;
print_r($_POST);
exit;
输出如下:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 512 100 474 100 38 6571 526 --:--:-- --:--:-- --:--:-- 6676
HEADER头:
Array
(
[Host] => li.wukong.com
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0
[Accept] => */*
[Cookie] => name1=1; name2=2; name3=3
[Content-Length] => 38
[Content-Type] => application/x-www-form-urlencoded
)
访问请求的原始数据的只读流:
a=2660884526&b=2660884526&c=2660884526
POST数据参数:
Array
(
[a] => 2660884526
[b] => 2660884526
[c] => 2660884526
)
好吧,重点是携带cookie,post数据合法的请求数据。当然了,上面的demo只是application/x-www-form-urlencode格式的,下面贴一个application/json 格式的,同样很简单
nohup curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0" -b cookie.txt -H 'Content-Type: application/json' -d '{"a":"2660884526", "b":"2660884526", "c":"2660884526"}' http://li.wukong.com/arr.php
响应如下:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 461 100 407 100 54 19760 2621 --:--:-- --:--:-- --:--:-- 21421
HEADER头:
Array
(
[Host] => li.wukong.com
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0
[Accept] => */*
[Cookie] => name1=1; name2=2; name3=3
[Content-Type] => application/json
[Content-Length] => 54
)
访问请求的原始数据的只读流:
{"a":"2660884526", "b":"2660884526", "c":"2660884526"}
POST数据参数:
Array
(
)
也很简单,只需要使用 -H 参数直接修改自定义header头即可。
下面附一个纯PHP模拟post表单提交的代码:
<?php
$post = '{"a":"2660884526", "b":"2660884526", "c":"2660884526"}';
$post = json_decode($post, true);
$ch = curl_init();
curl_setopt_array($ch , array(
CURLOPT_URL => "http://li.wukong.com/arr.php",
CURLOPT_HTTPHEADER => [
'Host:li.wukong.com',
'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0',
],
// CURLOPT_COOKIE => "name1=1; name2=2; name3=3",
CURLOPT_COOKIEFILE => "cookie.txt",
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $post,
));
$res = curl_exec($ch);
curl_close($ch);
var_dump($res);
响应如下:
string(503) "
HEADER头:
Array
(
[Host] => li.wukong.com
[Accept] => */*
[Cookie] => name1=1; name2=2; name3=3
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0
[Content-Length] => 346
[Expect] => 100-continue
[Content-Type] => multipart/form-data; boundary=------------------------a40cc9c12f3efc06
)
访问请求的原始数据的只读流:
POST数据参数:
Array
(
[a] => 2660884526
[b] => 2660884526
[c] => 2660884526
)
"
有一点需要注意一下,当post的数据是字符串而不是数组时,Content-Type会自动变成application/x-www-form-urlencoded。
上面的PHP代码,将json_decode那行注释之后响应如下:
string(489) "
HEADER头:
Array
(
[Host] => li.wukong.com
[Accept] => */*
[Cookie] => name1=1; name2=2; name3=3
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:50.0) Gecko/20100101 Firefox/50.0
[Content-Length] => 54
[Content-Type] => application/x-www-form-urlencoded
)
访问请求的原始数据的只读流:
{"a":"2660884526", "b":"2660884526", "c":"2660884526"}
POST数据参数:
Array
(
[{"a":"2660884526",_"b":"2660884526",_"c":"2660884526"}] =>
)
"