php正则函数抓取网页连接

php正则函数抓取网页连接

通用方法:php正则表达式有什么用

网站优化优采云 发表了文章 • 0 个评论 • 152 次浏览 • 2022-09-21 20:14 • 来自相关话题

  通用方法:php正则表达式有什么用
  我们什么时候使用正则表达式?并非所有字符操作都使用正则表达式。 PHP 使用正则表达式在某些方面影响效率。当我们遇到复杂文本数据的解析时,使用正则表达式是更好的选择。
  PHP 零基础到就业视频直播课:
  直播+实践教学+学习+实践+辅导
  【推荐】《如何实现接口的自动化测试?单流测试,组合测试,智能测试报告! 》
  优势
  在处理复杂的字符操作时,正则表达式可以提高工作效率,在一定程度上节省你的代码。
  缺点
  当我们使用正则表达式时,复杂的正则表达式会增加代码的复杂度,使其难以理解。所以我们有时需要在正则表达式里面添加注释。
  通用模式(推荐学习:PHP编程从入门到精通)
  分隔符,通常使用“/”作为分隔符的开始和结束,也可以使用“#”。
  什么时候使用“#”?通常当你的字符串中有很多“/”字符的时候,因为这些字符是常规的时候需要转义,比如uri。
  
  使用“/”分隔符的代码如下。
  $regex = '/^http:\/\/([\w.]+)\/([\w]+)\/([\w]+)\.html$/i';
$str = 'http://www.youku.com/show_page ... 3B%3B
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
  preg_match 中的$matches[0] 将收录匹配整个模式的字符串。
  使用“#”分隔符的代码如下。此时“/”没有转义!
  
  $regex = '#^http://([\w.]+)/([\w]+)/([\w]+)\.html$#i';
$str = 'http://www.youku.com/show_page ... 3B%3B
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
  正则表达式的定义可以概括如下:“正则表达式描述了字符串匹配的一种模式,通过它在特定的函数中进行匹配、查找、替换、分割字符串等操作。作为一个A匹配模板是由原子、特殊功能字符和模式修饰符组成的文字模式。”
  以上是php正则表达式使用的详细内容。更多详情请关注php中文网其他相关话题文章!
  操作方法:【Web Scraper 翻页——控制链接批量抓取数据(Web Scraper
  
  Web Scraper 翻页 - 控制链接批量抓取数据(高级 Web Scraper 使用) |简单的数据分析05
  
  这是简单数据分析系列的第五部分文章。第一部分文章我们爬取了豆瓣影业TOP250的前25部电影的数据,今天我们将对原有的Web Scraper进行一些小改动,让爬虫爬取全部250部电影数据。前面我们说过,爬虫的本质是寻找规则。这些程序员在设计网页时,肯定会遵循一些规则。当我们找到规则时,我们可以预测他们的行为并实现我们的目标。今天我们就来寻找豆瓣的规则网站,想办法把所有的数据都抓起来。今天的规则从经常被忽略的 URL 链接开始。 1.链接分析我们来看看第一页的豆瓣网址链接:…… 查看全部

  通用方法:php正则表达式有什么用
  我们什么时候使用正则表达式?并非所有字符操作都使用正则表达式。 PHP 使用正则表达式在某些方面影响效率。当我们遇到复杂文本数据的解析时,使用正则表达式是更好的选择。
  PHP 零基础到就业视频直播课:
  直播+实践教学+学习+实践+辅导
  【推荐】《如何实现接口的自动化测试?单流测试,组合测试,智能测试报告! 》
  优势
  在处理复杂的字符操作时,正则表达式可以提高工作效率,在一定程度上节省你的代码。
  缺点
  当我们使用正则表达式时,复杂的正则表达式会增加代码的复杂度,使其难以理解。所以我们有时需要在正则表达式里面添加注释。
  通用模式(推荐学习:PHP编程从入门到精通)
  分隔符,通常使用“/”作为分隔符的开始和结束,也可以使用“#”。
  什么时候使用“#”?通常当你的字符串中有很多“/”字符的时候,因为这些字符是常规的时候需要转义,比如uri。
  
  使用“/”分隔符的代码如下。
  $regex = '/^http:\/\/([\w.]+)\/([\w]+)\/([\w]+)\.html$/i';
$str = 'http://www.youku.com/show_page ... 3B%3B
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
  preg_match 中的$matches[0] 将收录匹配整个模式的字符串。
  使用“#”分隔符的代码如下。此时“/”没有转义!
  
  $regex = '#^http://([\w.]+)/([\w]+)/([\w]+)\.html$#i';
$str = 'http://www.youku.com/show_page ... 3B%3B
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
  正则表达式的定义可以概括如下:“正则表达式描述了字符串匹配的一种模式,通过它在特定的函数中进行匹配、查找、替换、分割字符串等操作。作为一个A匹配模板是由原子、特殊功能字符和模式修饰符组成的文字模式。”
  以上是php正则表达式使用的详细内容。更多详情请关注php中文网其他相关话题文章!
  操作方法:【Web Scraper 翻页——控制链接批量抓取数据(Web Scraper
  
  Web Scraper 翻页 - 控制链接批量抓取数据(高级 Web Scraper 使用) |简单的数据分析05
  
  这是简单数据分析系列的第五部分文章。第一部分文章我们爬取了豆瓣影业TOP250的前25部电影的数据,今天我们将对原有的Web Scraper进行一些小改动,让爬虫爬取全部250部电影数据。前面我们说过,爬虫的本质是寻找规则。这些程序员在设计网页时,肯定会遵循一些规则。当我们找到规则时,我们可以预测他们的行为并实现我们的目标。今天我们就来寻找豆瓣的规则网站,想办法把所有的数据都抓起来。今天的规则从经常被忽略的 URL 链接开始。 1.链接分析我们来看看第一页的豆瓣网址链接:……

php正则函数抓取网页连接(1)如何使用正则表达式表达式

网站优化优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-09-18 10:05 • 来自相关话题

  php正则函数抓取网页连接(1)如何使用正则表达式表达式
  
  php正则函数抓取网页连接(1)如何使用正则表达式抓取网页?php正则表达式是基于extra_prepare()函数抓取网页数据的一种表达式,网络上一般的正则表达式抓取效率比较低,并且比较耗费资源,因此一般都是使用正则表达式进行抓取数据,这些都是加以训练的,对初学者不友好,具体可以参考php正则表达式(正则表达式)学习笔记(正则表达式抓取网页)。
  
  那么,我们如何使用php正则表达式来抓取网页呢?一般我们需要写一个字符串抓取库,例如百度网页抓取库,知乎网页抓取库等等,这些库都是支持正则表达式的,具体的操作如下:/*定义一个字符串抓取库author:姓名,workyear:年月日format_code:1k=100*/libpython.middleware('example_middleware','pip_correctly',['author','workyear'])user_agent='w3c'cat_all='w3c'pat_link='w3c'pat_hash='w3c'index_name_before_word='links/example'index_name_after_word='links/user'index_all=index_name_after_wordreturnrequire('example_middleware').get('format_code','1k');//获取文件名returnrequire('format_code').get('format_format_code','1k');//获取文件内容returnrequire('format_code').get('format_format_code','1k');//对文件名进行判断pat_link='format'pat_hash='w3c'pat_link=format('format','w3c')//对文件内容进行判断pat_hash=hash('w3c')//获取文件标题pat_title=format('format','w3c')pat_title='w3c'returnpat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_title.begin()pat_title=pat_title.end()pat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlereturnpat_title例如,你是需要抓取百度的xxxabcxxx类型的数据,那么,这个时候要看返回了这些结果:headers={'accept':'*/*','accept-language':'zh-cn','accept-encoding':'gzip','connection':'keep-alive','cookie':"zh-cn16731468d623e66b。 查看全部

  php正则函数抓取网页连接(1)如何使用正则表达式表达式
  
  php正则函数抓取网页连接(1)如何使用正则表达式抓取网页?php正则表达式是基于extra_prepare()函数抓取网页数据的一种表达式,网络上一般的正则表达式抓取效率比较低,并且比较耗费资源,因此一般都是使用正则表达式进行抓取数据,这些都是加以训练的,对初学者不友好,具体可以参考php正则表达式(正则表达式)学习笔记(正则表达式抓取网页)。
  
  那么,我们如何使用php正则表达式来抓取网页呢?一般我们需要写一个字符串抓取库,例如百度网页抓取库,知乎网页抓取库等等,这些库都是支持正则表达式的,具体的操作如下:/*定义一个字符串抓取库author:姓名,workyear:年月日format_code:1k=100*/libpython.middleware('example_middleware','pip_correctly',['author','workyear'])user_agent='w3c'cat_all='w3c'pat_link='w3c'pat_hash='w3c'index_name_before_word='links/example'index_name_after_word='links/user'index_all=index_name_after_wordreturnrequire('example_middleware').get('format_code','1k');//获取文件名returnrequire('format_code').get('format_format_code','1k');//获取文件内容returnrequire('format_code').get('format_format_code','1k');//对文件名进行判断pat_link='format'pat_hash='w3c'pat_link=format('format','w3c')//对文件内容进行判断pat_hash=hash('w3c')//获取文件标题pat_title=format('format','w3c')pat_title='w3c'returnpat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_title.begin()pat_title=pat_title.end()pat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlereturnpat_title例如,你是需要抓取百度的xxxabcxxx类型的数据,那么,这个时候要看返回了这些结果:headers={'accept':'*/*','accept-language':'zh-cn','accept-encoding':'gzip','connection':'keep-alive','cookie':"zh-cn16731468d623e66b。

公众号登录接口返回404状态码:php正则函数抓取

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-09-17 04:00 • 来自相关话题

  公众号登录接口返回404状态码:php正则函数抓取
  
  php正则函数抓取网页连接:http/1。1host:namename:{authorization:'remote_method'}http/1。1host:username:。
  
  公众号id登录接口返回404状态码:404404:passwordnotfound文件上传接口返回302、303、304状态码:3--
  抓了n年的php应用程序,无论开源,还是商业,一直单纯写逻辑,简单粗暴就好,实现你的简单功能,别太复杂。把别人的框架抄来用一下,就可以了。简单的方案,抓包,抓包下面很多接口。不同接口的请求地址,调用顺序,url都不一样,网上有很多,比如springboot就是这么搞的。把静态资源复制下来,变成静态字符串,变成$_post,变成$_get,$_session,{"xxx":"xxx"}$_username,$_post,{"xxx":"xxx"}$_session都是很好的对象param。 查看全部

  公众号登录接口返回404状态码:php正则函数抓取
  
  php正则函数抓取网页连接:http/1。1host:namename:{authorization:'remote_method'}http/1。1host:username:。
  
  公众号id登录接口返回404状态码:404404:passwordnotfound文件上传接口返回302、303、304状态码:3--
  抓了n年的php应用程序,无论开源,还是商业,一直单纯写逻辑,简单粗暴就好,实现你的简单功能,别太复杂。把别人的框架抄来用一下,就可以了。简单的方案,抓包,抓包下面很多接口。不同接口的请求地址,调用顺序,url都不一样,网上有很多,比如springboot就是这么搞的。把静态资源复制下来,变成静态字符串,变成$_post,变成$_get,$_session,{"xxx":"xxx"}$_username,$_post,{"xxx":"xxx"}$_session都是很好的对象param。

php正则函数抓取网页连接为http的页面(图)

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-09-14 17:05 • 来自相关话题

  php正则函数抓取网页连接为http的页面(图)
  php正则函数抓取网页连接为http的页面,我们抓取的时候找到a标签,a标签的href值就是正则表达式的响应结果:req=request。urlopen(“g:/php/xxx。php?a=http&b=&c=&d=&e=&f=&g=&h=&i=&j=&k=&l=&m=&n=&o=&s=&v=&w=&xxx。
  
  cn&q=php”);xxx。php就是我们需要分析的目标页面地址,同时表示req的接收端:我们查看返回的g:/php/xxx。php文件内容php_http。html,我们发现页面结构没有什么变化,其中文件名和url都为php_http。html。其中b和c都为a标签的href值,b,c为a标签下面的子标签i,i为子标签的label标签名,和普通链接一样,子标签url和子标签i相对定位就好,而且i和url的长度没有什么区别,所以我们把页面变换一下就可以了,然后处理,我们直接使用g:/php/xxx。
  php抓取页面内容,本地本地查看,g:/php/xxx。php是否执行正确,不正确的话,查看ip地址:g:/php/xxx。php因为正则一般都是显示前面的字符,所以我们把这个问题传给这个http请求d:/php/xxx。php传递参数ex原则上我们抓取页面到某个ex后我们可以不管这个http请求g:/php/xxx。
  
  php是否执行我们就用httpget去下载内容,那么,问题又来了,爬虫其实是调用了正则来读取某个结构或者网页数据,但是我们想自己抓取http的html源码,还要转换为list,我们怎么办呢?其实我们可以用正则表达式来解决,但是很多时候很长的正则可能要处理很久,这里我们可以手动写代码进行转换,也可以借助一些工具转换,手动写代码:我们还是从捕获链接开始抓取:;e。
  gp=/http/hello-world/:920-l01-0753-afd7-e71b84a9433d0/-hub-%e5%8e%a3%e6%a3%a9%e4%be%98%e5%93%80%e8%b5%b4%e8%bd%af%e5%88%90%e5%92%89%e7%94%9f%e7%9b%bd/g:/php/xxx。
  php看看能否抓取下来,看一下时间和urlurl为:;e。gp=/http/hello-world/:920-l01-0753-afd7-e71b84a9433d0/-hub-%e5%8e%a3%e6%a3%a9%e4%be%98%e5%93%80%e8%b5%b4%e8%bd%af%e5%88%90%e5%92%89%e7%94%9f%e7%9b%bd/g:/php/xxx。php其中的/http/hello-world/:92。 查看全部

  php正则函数抓取网页连接为http的页面(图)
  php正则函数抓取网页连接为http的页面,我们抓取的时候找到a标签,a标签的href值就是正则表达式的响应结果:req=request。urlopen(“g:/php/xxx。php?a=http&b=&c=&d=&e=&f=&g=&h=&i=&j=&k=&l=&m=&n=&o=&s=&v=&w=&xxx。
  
  cn&q=php”);xxx。php就是我们需要分析的目标页面地址,同时表示req的接收端:我们查看返回的g:/php/xxx。php文件内容php_http。html,我们发现页面结构没有什么变化,其中文件名和url都为php_http。html。其中b和c都为a标签的href值,b,c为a标签下面的子标签i,i为子标签的label标签名,和普通链接一样,子标签url和子标签i相对定位就好,而且i和url的长度没有什么区别,所以我们把页面变换一下就可以了,然后处理,我们直接使用g:/php/xxx。
  php抓取页面内容,本地本地查看,g:/php/xxx。php是否执行正确,不正确的话,查看ip地址:g:/php/xxx。php因为正则一般都是显示前面的字符,所以我们把这个问题传给这个http请求d:/php/xxx。php传递参数ex原则上我们抓取页面到某个ex后我们可以不管这个http请求g:/php/xxx。
  
  php是否执行我们就用httpget去下载内容,那么,问题又来了,爬虫其实是调用了正则来读取某个结构或者网页数据,但是我们想自己抓取http的html源码,还要转换为list,我们怎么办呢?其实我们可以用正则表达式来解决,但是很多时候很长的正则可能要处理很久,这里我们可以手动写代码进行转换,也可以借助一些工具转换,手动写代码:我们还是从捕获链接开始抓取:;e。
  gp=/http/hello-world/:920-l01-0753-afd7-e71b84a9433d0/-hub-%e5%8e%a3%e6%a3%a9%e4%be%98%e5%93%80%e8%b5%b4%e8%bd%af%e5%88%90%e5%92%89%e7%94%9f%e7%9b%bd/g:/php/xxx。
  php看看能否抓取下来,看一下时间和urlurl为:;e。gp=/http/hello-world/:920-l01-0753-afd7-e71b84a9433d0/-hub-%e5%8e%a3%e6%a3%a9%e4%be%98%e5%93%80%e8%b5%b4%e8%bd%af%e5%88%90%e5%92%89%e7%94%9f%e7%9b%bd/g:/php/xxx。php其中的/http/hello-world/:92。

php正则用:反爬虫用selenium建议去买个小米路由器

网站优化优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-07-26 14:02 • 来自相关话题

  php正则用:反爬虫用selenium建议去买个小米路由器
  php正则函数抓取网页连接。抓取首页有时会抓到密码框的数据。还有一种常见的方法是抓取php反向工程的文件,从而抓取整个页面。学会抓取网页上没有的东西,比如隐藏的功能,等等。
  创建爬虫用:反爬虫用selenium
  建议去买个小米路由器1体验一下。
  补充楼上一个selenium,
  
  网络请求,建议先用requests或urllib.request获取url中的xpath。能用浏览器访问则更好,不然你发现你爬某站失败了,因为你不知道url和xpath中是否包含了该站的关键词。
  创建爬虫用:反爬虫用selenium用:
  多爬几站找几个标签网站做爬虫1,多爬几站找几个标签网站做爬虫2,
  php的话,建议使用google的selenium抓包,用原生js可以实现动态页面的抓取,
  我写过爬虫脚本,python没用过。最直接的是利用beautifulsoup解析网页中的xpath。
  
  当然是selenium咯
  推荐selenium,
  花了一个小时了解了一下爬虫的一些基本技巧。1.什么是爬虫:就是一些能够模拟浏览器行为从url(路径)中解析出“html”,然后返回给浏览器的程序。2.简单了解了一下selenium框架的构造和整合,使用了python2.7和python3。了解到python语言中的extension必须在一个python源文件的头文件中添加@extension的代码注解。
  3.整个爬虫的github地址:spiderspider-spiderhubv2.1.1是python2.7。4.代码分享地址:,我是通过python的python-common库的python/selenium框架搞定的,selenium第二个模块dom(dom)加载和python原生的html(htmlform)操作比起来,要复杂一些。
<p>python-common只需要在导入前加上两行python的注解:-shared_class(isabstract)+-shared_class(isabstract)5.方法分享:其实上面的方法都是多余的,因为我没有实际使用,如果你只是会造轮子,那么直接在selenium中直接操作浏览器的时候插入如下的代码#define_directory(task)#以后就不能手动输入host了#通过python的python-common代码注解如下:classspiderspider:defstart(self):self.task=taskdefdisplay(self):if(self.task==task):#如果self.task==task代码结束#重写super().start()print'helloworld'withopen('test.html','a')asf:f.write("我要执行'我要执行'我要执行'我要执行' 查看全部

  php正则用:反爬虫用selenium建议去买个小米路由器
  php正则函数抓取网页连接。抓取首页有时会抓到密码框的数据。还有一种常见的方法是抓取php反向工程的文件,从而抓取整个页面。学会抓取网页上没有的东西,比如隐藏的功能,等等。
  创建爬虫用:反爬虫用selenium
  建议去买个小米路由器1体验一下。
  补充楼上一个selenium,
  
  网络请求,建议先用requests或urllib.request获取url中的xpath。能用浏览器访问则更好,不然你发现你爬某站失败了,因为你不知道url和xpath中是否包含了该站的关键词
  创建爬虫用:反爬虫用selenium用:
  多爬几站找几个标签网站做爬虫1,多爬几站找几个标签网站做爬虫2,
  php的话,建议使用google的selenium抓包,用原生js可以实现动态页面的抓取,
  我写过爬虫脚本,python没用过。最直接的是利用beautifulsoup解析网页中的xpath。
  
  当然是selenium咯
  推荐selenium,
  花了一个小时了解了一下爬虫的一些基本技巧。1.什么是爬虫:就是一些能够模拟浏览器行为从url(路径)中解析出“html”,然后返回给浏览器的程序。2.简单了解了一下selenium框架的构造和整合,使用了python2.7和python3。了解到python语言中的extension必须在一个python源文件的头文件中添加@extension的代码注解。
  3.整个爬虫的github地址:spiderspider-spiderhubv2.1.1是python2.7。4.代码分享地址:,我是通过python的python-common库的python/selenium框架搞定的,selenium第二个模块dom(dom)加载和python原生的html(htmlform)操作比起来,要复杂一些。
<p>python-common只需要在导入前加上两行python的注解:-shared_class(isabstract)+-shared_class(isabstract)5.方法分享:其实上面的方法都是多余的,因为我没有实际使用,如果你只是会造轮子,那么直接在selenium中直接操作浏览器的时候插入如下的代码#define_directory(task)#以后就不能手动输入host了#通过python的python-common代码注解如下:classspiderspider:defstart(self):self.task=taskdefdisplay(self):if(self.task==task):#如果self.task==task代码结束#重写super().start()print'helloworld'withopen('test.html','a')asf:f.write("我要执行'我要执行'我要执行'我要执行'

php正则函数抓取网页连接,举个例子(一)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2022-07-04 19:02 • 来自相关话题

  php正则函数抓取网页连接,举个例子(一)
  php正则函数抓取网页连接,举个例子如下:method('location(\w\w)(\w\w)');post。open("",method('location(\w\w)(\w\w)'));执行该代码后访问:8080/www/*/可以看到存在包含:www/*/,rest回来解析:method('location(\w\w)(\w\w)');post。
  
  open("",method('location(\w\w)(\w\w)'));rest的数据类型为:http请求(个人猜测应该是get)url地址rest的数据类型为:http请求(个人猜测应该是get)rest对象http请求对象:request_body请求头部:host(host)user-agent(浏览器的隐藏部分)port(port)cookie(cookie)body(请求内容)(header)policy(policy)http返回结果post返回结果:accept/x-www-form-urlencoded//(请求类型选择列表,user-agent,port);通过http请求向www服务器传递一个必要参数,该参数是客户端可以通过http函数获取服务器实际返回的内容:content-type:(如果非空,则为application/x-www-form-urlencoded请求头:是否返回响应体响应体:是否需要参数params:(用于http请求参数)//(请求头参数),返回有header和rest对象的信息完整代码:__attribute__:publicfinalstringhttp(stringurl,stringrequest,stringresponse){stringlanguage=stringutils。
  newbyline(url。header);stringname=stringutils。newbyline(request。getheader("x-http-x-name"));stringuser=language+"request"+request。getheader("user-agent");if(name=="www"){stringscheme=stringutils。
  
  newbyline(request。getheader("scheme"));if(user=="*"){stringtimestamp=newdate();if(timestamp。value。tolowercase()。tolowercase()){timestamp。value=timestamp。
  long();}}}http(language,user,scheme);returnname;}//xmlhttprequestrequest请求过程详解:http(host,user,scheme):表示请求url,即你的服务器所在机房里的机器。(如果是其他机器则。 查看全部

  php正则函数抓取网页连接,举个例子(一)
  php正则函数抓取网页连接,举个例子如下:method('location(\w\w)(\w\w)');post。open("",method('location(\w\w)(\w\w)'));执行该代码后访问:8080/www/*/可以看到存在包含:www/*/,rest回来解析:method('location(\w\w)(\w\w)');post。
  
  open("",method('location(\w\w)(\w\w)'));rest的数据类型为:http请求(个人猜测应该是get)url地址rest的数据类型为:http请求(个人猜测应该是get)rest对象http请求对象:request_body请求头部:host(host)user-agent(浏览器的隐藏部分)port(port)cookie(cookie)body(请求内容)(header)policy(policy)http返回结果post返回结果:accept/x-www-form-urlencoded//(请求类型选择列表,user-agent,port);通过http请求向www服务器传递一个必要参数,该参数是客户端可以通过http函数获取服务器实际返回的内容:content-type:(如果非空,则为application/x-www-form-urlencoded请求头:是否返回响应体响应体:是否需要参数params:(用于http请求参数)//(请求头参数),返回有header和rest对象的信息完整代码:__attribute__:publicfinalstringhttp(stringurl,stringrequest,stringresponse){stringlanguage=stringutils。
  newbyline(url。header);stringname=stringutils。newbyline(request。getheader("x-http-x-name"));stringuser=language+"request"+request。getheader("user-agent");if(name=="www"){stringscheme=stringutils。
  
  newbyline(request。getheader("scheme"));if(user=="*"){stringtimestamp=newdate();if(timestamp。value。tolowercase()。tolowercase()){timestamp。value=timestamp。
  long();}}}http(language,user,scheme);returnname;}//xmlhttprequestrequest请求过程详解:http(host,user,scheme):表示请求url,即你的服务器所在机房里的机器。(如果是其他机器则。

网易云音乐热门作品名字和链接抓取(正则表达式篇)

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-06-27 12:23 • 来自相关话题

  网易云音乐热门作品名字和链接抓取(正则表达式篇)
  点击上方“Python共享之家”,进行关注
  回复“资源”即可获赠Python学习资料
  今
  日
  鸡
  汤
  问姓惊初见,称名忆旧容。
  
  大家好,我是皮皮。
  一、前言
  前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。
  二、实现过程
  究其原因是返回的响应里边并不是规整的html格式,所以直接使用xpath是拿不到的。这里【Python进阶者】给了一个使用正则表达式的方法来实现的代码,代码如下。
<p># coding:utf-8<br /><br /># @Time : 2022/5/9 23:46<br /># @Author: 皮皮<br /># @公众号: Python共享之家<br /># @website : http://pdcfighting.com/<br /># @File : 网易云音乐热门作品名字和链接(正则表达式).py<br /># @Software: PyCharm<br /><br />#<br />#                             _ooOoo_<br />#                            o8888888o<br />#                            88" . "88<br />#                            (| -_- |)<br />#                            O\  =  /O<br />#                         ____/`---'\____<br />#                       .'  \\|     |//  `.<br />#                      /  \\|||  :  |||//  \<br />#                     /  _||||| -:- |||||-  \<br />#                     |   | \\\  -  /// |   |<br />#                     | \_|  ''\---/''  |   |<br />#                     \  .-\__  `-`  ___/-. /<br />#                   ___`. .'  /--.--\  `. . __<br />#                ."" ' 查看全部

  网易云音乐热门作品名字和链接抓取(正则表达式篇)
  点击上方“Python共享之家”,进行关注
  回复“资源”即可获赠Python学习资料
  今
  日
  鸡
  汤
  问姓惊初见,称名忆旧容。
  
  大家好,我是皮皮。
  一、前言
  前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。
  二、实现过程
  究其原因是返回的响应里边并不是规整的html格式,所以直接使用xpath是拿不到的。这里【Python进阶者】给了一个使用正则表达式的方法来实现的代码,代码如下。
<p># coding:utf-8<br /><br /># @Time : 2022/5/9 23:46<br /># @Author: 皮皮<br /># @公众号: Python共享之家<br /># @website : http://pdcfighting.com/<br /># @File : 网易云音乐热门作品名字和链接(正则表达式).py<br /># @Software: PyCharm<br /><br />#<br />#                             _ooOoo_<br />#                            o8888888o<br />#                            88" . "88<br />#                            (| -_- |)<br />#                            O\  =  /O<br />#                         ____/`---'\____<br />#                       .'  \\|     |//  `.<br />#                      /  \\|||  :  |||//  \<br />#                     /  _||||| -:- |||||-  \<br />#                     |   | \\\  -  /// |   |<br />#                     | \_|  ''\---/''  |   |<br />#                     \  .-\__  `-`  ___/-. /<br />#                   ___`. .'  /--.--\  `. . __<br />#                ."" '

php正则函数抓取网页连接和提取内容都可以用mt+

网站优化优采云 发表了文章 • 0 个评论 • 214 次浏览 • 2022-06-24 06:02 • 来自相关话题

  php正则函数抓取网页连接和提取内容都可以用mt+
  php正则函数抓取网页连接和提取内容都可以用mt+re,
  1.可以使用正则表达式或者模糊匹配把网址从整个页面提取出来。
  正则表达式,譬如匹配这类特殊字符,
  正则表达式
  可以在提取url的基础上用正则表达式来定位要提取的字符串。比如,你要提取“赵”这个字,
  2)”将整个url“(美元的$1,$
  2)”中“$1”替换成被替换的单词,
  2)”提取出“赵”这个字。
  我的一般工作就是爬虫,也用python进行爬虫,碰到知乎的这个提问感觉很惊讶,学了python如何提取网页中的文字呢?从字面理解可以提取关键词、url等信息,但是有没有想过爬虫自己还会存在连接网页文字的情况呢?在python中可以借助正则表达式,那我们不就又有可能获取网页中的所有文字信息,那可以思考一下下图1是源代码地址,2是我们要爬取的链接地址,我们希望网页中的文字也能提取出来。
  图1图2我们可以发现图1中所有的表头都存放在一个叫id类型中,方便我们进行后续的分析和匹配等等;下图3中entitys都存放在info这个类型中;这些类型都是正则表达式特定字符,方便我们定位到真正需要的关键词或者文字。如果要找关键词,就写python代码过滤,如果找到文字就放入列表;在python中还可以利用正则表达式,快速从网页文字中提取文字,但是这样可能效率太低了;还可以使用第三方工具,譬如说爬虫常用的selenium,这类软件常常会用到正则表达式,有时候正则表达式比直接在网页上爬取关键词是更快更方便的。
  但是要用代码写的话真的很麻烦,我是说常常的麻烦,网上基本上找不到可以用python编写正则表达式的库;此外有可能我根本就用不上这么复杂的正则表达式。网上没有,那我还不如直接爬网页文字,爬哪网页文字我就存哪里,方便我比较完全吧。而且你要把正则表达式写得不见文字的话是不是又有点浪费时间。知乎也有过这样的提问,其实把正则表达式写在方法里是个不错的方式,但是我觉得那样没有写正则表达式直接在网页中爬取效率高啊,我的经验是网页文字可以不一定有那么多。方法有了,我觉得知乎也就有点玄学的感觉了。 查看全部

  php正则函数抓取网页连接和提取内容都可以用mt+
  php正则函数抓取网页连接和提取内容都可以用mt+re,
  1.可以使用正则表达式或者模糊匹配把网址从整个页面提取出来。
  正则表达式,譬如匹配这类特殊字符,
  正则表达式
  可以在提取url的基础上用正则表达式来定位要提取的字符串。比如,你要提取“赵”这个字,
  2)”将整个url“(美元的$1,$
  2)”中“$1”替换成被替换的单词,
  2)”提取出“赵”这个字。
  我的一般工作就是爬虫,也用python进行爬虫,碰到知乎的这个提问感觉很惊讶,学了python如何提取网页中的文字呢?从字面理解可以提取关键词、url等信息,但是有没有想过爬虫自己还会存在连接网页文字的情况呢?在python中可以借助正则表达式,那我们不就又有可能获取网页中的所有文字信息,那可以思考一下下图1是源代码地址,2是我们要爬取的链接地址,我们希望网页中的文字也能提取出来。
  图1图2我们可以发现图1中所有的表头都存放在一个叫id类型中,方便我们进行后续的分析和匹配等等;下图3中entitys都存放在info这个类型中;这些类型都是正则表达式特定字符,方便我们定位到真正需要的关键词或者文字。如果要找关键词,就写python代码过滤,如果找到文字就放入列表;在python中还可以利用正则表达式,快速从网页文字中提取文字,但是这样可能效率太低了;还可以使用第三方工具,譬如说爬虫常用的selenium,这类软件常常会用到正则表达式,有时候正则表达式比直接在网页上爬取关键词是更快更方便的。
  但是要用代码写的话真的很麻烦,我是说常常的麻烦,网上基本上找不到可以用python编写正则表达式的库;此外有可能我根本就用不上这么复杂的正则表达式。网上没有,那我还不如直接爬网页文字,爬哪网页文字我就存哪里,方便我比较完全吧。而且你要把正则表达式写得不见文字的话是不是又有点浪费时间。知乎也有过这样的提问,其实把正则表达式写在方法里是个不错的方式,但是我觉得那样没有写正则表达式直接在网页中爬取效率高啊,我的经验是网页文字可以不一定有那么多。方法有了,我觉得知乎也就有点玄学的感觉了。

php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS

网站优化优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-06-13 19:53 • 来自相关话题

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS 查看全部

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS

php正则函数抓取网页连接,但是需要注意哪些问题?

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-06-13 02:02 • 来自相关话题

  php正则函数抓取网页连接,但是需要注意哪些问题?
  php正则函数抓取网页连接,但是如果这个网页比较大,抓取速度会变慢。如果把一些大连接字符串映射为一些小连接字符串,会极大减少抓取时间。对于一些小网站,只需要把网页内容中的固定字符转换成一些固定长度的字符串,然后用正则表达式进行匹配,如果字符串长度等于或等于原字符串长度,匹配失败,字符串长度小于原字符串长度,匹配成功。转换的过程中去掉了空格、特殊字符等字符,数据量控制在可接受范围内。
  可以把多条字符串,一对一的拼接成一条新的连接字符串。
  replace()可以匹配一对一的,或者用一个正则表达式写连接函数或者手工匹配。直接用正则表达式匹配已经有连接结果数据库查询,
  简单举个例子,字符串里写一个{1,2,3},匹配的过程在字符串里添加一个1和2的组合,把1粘合在字符串的1后面,把2粘合在字符串的2后面。匹配需要匹配多次,所以要看匹配到的字符串的长度是否小于1。匹配的次数为1次匹配不通过,匹配次数为100次,匹配的结果就会被replace掉,完成词组匹配。匹配的词组越长,replace的次数就会越多。
  可以一般字符串匹配用正则表达式,列表匹配用正则表达式,
  匹配字符串有5种方法:
  1、自动匹配
  2、搜索匹配
  3、正则匹配
  4、替换匹配
  5、正则+字符串匹配 查看全部

  php正则函数抓取网页连接,但是需要注意哪些问题?
  php正则函数抓取网页连接,但是如果这个网页比较大,抓取速度会变慢。如果把一些大连接字符串映射为一些小连接字符串,会极大减少抓取时间。对于一些小网站,只需要把网页内容中的固定字符转换成一些固定长度的字符串,然后用正则表达式进行匹配,如果字符串长度等于或等于原字符串长度,匹配失败,字符串长度小于原字符串长度,匹配成功。转换的过程中去掉了空格、特殊字符等字符,数据量控制在可接受范围内。
  可以把多条字符串,一对一的拼接成一条新的连接字符串。
  replace()可以匹配一对一的,或者用一个正则表达式写连接函数或者手工匹配。直接用正则表达式匹配已经有连接结果数据库查询,
  简单举个例子,字符串里写一个{1,2,3},匹配的过程在字符串里添加一个1和2的组合,把1粘合在字符串的1后面,把2粘合在字符串的2后面。匹配需要匹配多次,所以要看匹配到的字符串的长度是否小于1。匹配的次数为1次匹配不通过,匹配次数为100次,匹配的结果就会被replace掉,完成词组匹配。匹配的词组越长,replace的次数就会越多。
  可以一般字符串匹配用正则表达式,列表匹配用正则表达式,
  匹配字符串有5种方法:
  1、自动匹配
  2、搜索匹配
  3、正则匹配
  4、替换匹配
  5、正则+字符串匹配

php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS

网站优化优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2022-06-03 08:41 • 来自相关话题

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS 查看全部

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS

php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-06-02 01:38 • 来自相关话题

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS 查看全部

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS

网易云音乐热门作品名字和链接抓取(html5lib篇)

网站优化优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2022-06-01 13:20 • 来自相关话题

  网易云音乐热门作品名字和链接抓取(html5lib篇)
  点击上方“Python共享之家”,进行关注
  回复“资源”即可获赠Python学习资料
  今
  日
  鸡
  汤
  落叶人何在,寒云路几层。
  大家好,我是皮皮。
  一、前言
  前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。
  
  之前的文章,已经使用了正则表达式和xpath、bs4和pyquery四个方法进行了相关实现,,,,,这篇文章我们使用html5lib来实现。
  二、实现过程
  这里【甯同学】给了一个使用html5lib方法来实现的代码,简单来说就是用html5lib修复html就可以了,代码如下。 <p># coding:utf-8<br /><br /># @Time : 2022/5/10 10:46<br /># @Author: 皮皮<br /># @公众号: Python共享之家<br /># @website : http://pdcfighting.com/<br /># @File : 网易云音乐热门作品名字和链接(html5lib).py<br /># @Software: PyCharm<br /><br />#<br />#                             _ooOoo_<br />#                            o8888888o<br />#                            88" . "88<br />#                            (| -_- |)<br />#                            O\  =  /O<br />#                         ____/`---'\____<br />#                       .'  \\|     |//  `.<br />#                      /  \\|||  :  |||//  \<br />#                     /  _||||| -:- |||||-  \<br />#                     |   | \\\  -  /// |   |<br />#                     | \_|  ''\---/''  |   |<br />#                     \  .-\__  `-`  ___/-. /<br />#                   ___`. .'  /--.--\  `. . __<br />#                ."" ' 查看全部

  网易云音乐热门作品名字和链接抓取(html5lib篇)
  点击上方“Python共享之家”,进行关注
  回复“资源”即可获赠Python学习资料
  今
  日
  鸡
  汤
  落叶人何在,寒云路几层。
  大家好,我是皮皮。
  一、前言
  前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。
  
  之前的文章,已经使用了正则表达式和xpath、bs4和pyquery四个方法进行了相关实现,,,,,这篇文章我们使用html5lib来实现。
  二、实现过程
  这里【甯同学】给了一个使用html5lib方法来实现的代码,简单来说就是用html5lib修复html就可以了,代码如下。 <p># coding:utf-8<br /><br /># @Time : 2022/5/10 10:46<br /># @Author: 皮皮<br /># @公众号: Python共享之家<br /># @website : http://pdcfighting.com/<br /># @File : 网易云音乐热门作品名字和链接(html5lib).py<br /># @Software: PyCharm<br /><br />#<br />#                             _ooOoo_<br />#                            o8888888o<br />#                            88" . "88<br />#                            (| -_- |)<br />#                            O\  =  /O<br />#                         ____/`---'\____<br />#                       .'  \\|     |//  `.<br />#                      /  \\|||  :  |||//  \<br />#                     /  _||||| -:- |||||-  \<br />#                     |   | \\\  -  /// |   |<br />#                     | \_|  ''\---/''  |   |<br />#                     \  .-\__  `-`  ___/-. /<br />#                   ___`. .'  /--.--\  `. . __<br />#                ."" '

OCR入门(附数据集链接)

网站优化优采云 发表了文章 • 0 个评论 • 299 次浏览 • 2022-05-15 01:36 • 来自相关话题

  OCR入门(附数据集链接)
  
  近日,“大学生用OCR+正则表达式快速核查学生核酸报告”的新闻火了,细心观察我们就能发现,生活里OCR的身影到处都是:文档扫描、车牌识别、证件识别等等。在这个信息技术高速发展的时代,越来越多的小事可以“智能化”、“信息化”,曾经需要浪费诸多人力物力才能完成的事,可以通过新的技术轻松地解决。
  
  01
  OCR是解决什么问题的技术
  
  文章开头提到的新闻里,OCR技术到底解决了什么问题?上图是一张上海市健康云截图,复旦大学博士生使用OCR技术监测到文本,再提取其中的文字信息,每次核查数百人的截图仅需几分钟。抽象的字符让人感觉技术深不可测,但是等读者们稍作了解之后,会发现高科技是非常亲切实用的。OCR中文名叫做“光学字符识别”,它可以将名片、票据、身份证、驾照等文档资料中的文字和数字信息转换成文本信息,以电子形式保存,实现信息采集的快速录入。现在有非常多实现OCR功能的免费接口,传入图片路径,就可以调用接口函数,识别图片中的文字信息。
  02
  OCR的常见流程
  
  常见OCR方法的具体过程通常分为以下四个步骤:
  预处理:是对图像进行初步的处理,目的是减少图像中的无用信息,方便提取特征。常用的步骤有:灰度化、降噪、二值化、字符切分、归一化等。特征提取和降维:是识别文字、数字的关键步骤之一。特征是识别文字的关键信息,每个不同的文字通过特征来和其他文字进行区分。数字和英文字符相对中文字符来说更容易区分。为了提高后续分类器的效果和效率,往往还要进行降维,进一步减少特征中的无用信息,同时把有用信息尽可能多地保留下来。分类器设计:对特征进行识别,是进行文字、数字识别的关键步骤之一。在这一步中,分类器对特征进行分类,将其识别成对应的字符。分类器一般需要提前训练,常见的分类器有:支持向量机、神经网络等。后处理:是对分类结果进行优化处理的步骤。经过分类器分类得到的结果是不完全准确的,比如对形近字的识别错误率比较高、识别结果存在排版错误,后处理就可以有针对性地解决这些问题。例如,通过语言模型校正将“存哪里”校正为“在哪里”,并对识别结果进行格式化。
  03
  正则表达式是什么
  
  正则表达式在人物场景中承担的是什么责任呢?经过前面叙述的流程,从图片中提取出来的文字信息,需要进一步整理提取,实现自动化核查。正则表达式通常被用来检索、替换符合特定模式的文本。正则表达式可以提取出文本中的特定文本,即:姓名、证件号码、采样时间、检测结果等,再输出到Excel中。
  04
  OCR数据集
  
  目前主流的OCR任务会使用深度学习方法,这意味着数据集是其中的关键。
  文本检测数据集SynthText:~vgg/data/scenetext/ICDAR是竞赛数据集,2003年、2013年、2015年、2017年分别开放了以下数据集:谷歌图像中收集整理得到的IIIT 5K words数据集:还有一些公开数据集,如:SVT、CUTE等。Github上有一个OCR数据汇总可以查看:大多数OCR数据集包含的图像数量比较少,并不足以训练出一个模型,需要合成新的数据集使用。
  05
  小结
  
  OCR技术不算是最新的技术,早在十年前它就火过,随着近年深度学习的迅速发展,基于深度学习的OCR技术也逐渐成熟,能够更好更灵活地应对不同场景,已经成为科技公司的能力标配。
  进技术交流群请添加AINLP小助手微信(id: ainlper)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />请备注具体方向+所用到的相关技术点<p style="margin-top: 15px;margin-bottom: 15px;outline: 0px;max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;widows: 1;caret-color: rgb(51, 51, 51);white-space: pre-line;line-height: 30px;color: rgb(74, 74, 74);font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif;overflow-wrap: break-word !important;">关于AINLP
  AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
  <br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
  
  阅读至此了,分享、点赞、在看三选一吧</p> 查看全部

  OCR入门(附数据集链接)
  
  近日,“大学生用OCR+正则表达式快速核查学生核酸报告”的新闻火了,细心观察我们就能发现,生活里OCR的身影到处都是:文档扫描、车牌识别、证件识别等等。在这个信息技术高速发展的时代,越来越多的小事可以“智能化”、“信息化”,曾经需要浪费诸多人力物力才能完成的事,可以通过新的技术轻松地解决。
  
  01
  OCR是解决什么问题的技术
  
  文章开头提到的新闻里,OCR技术到底解决了什么问题?上图是一张上海市健康云截图,复旦大学博士生使用OCR技术监测到文本,再提取其中的文字信息,每次核查数百人的截图仅需几分钟。抽象的字符让人感觉技术深不可测,但是等读者们稍作了解之后,会发现高科技是非常亲切实用的。OCR中文名叫做“光学字符识别”,它可以将名片、票据、身份证、驾照等文档资料中的文字和数字信息转换成文本信息,以电子形式保存,实现信息采集的快速录入。现在有非常多实现OCR功能的免费接口,传入图片路径,就可以调用接口函数,识别图片中的文字信息。
  02
  OCR的常见流程
  
  常见OCR方法的具体过程通常分为以下四个步骤:
  预处理:是对图像进行初步的处理,目的是减少图像中的无用信息,方便提取特征。常用的步骤有:灰度化、降噪、二值化、字符切分、归一化等。特征提取和降维:是识别文字、数字的关键步骤之一。特征是识别文字的关键信息,每个不同的文字通过特征来和其他文字进行区分。数字和英文字符相对中文字符来说更容易区分。为了提高后续分类器的效果和效率,往往还要进行降维,进一步减少特征中的无用信息,同时把有用信息尽可能多地保留下来。分类器设计:对特征进行识别,是进行文字、数字识别的关键步骤之一。在这一步中,分类器对特征进行分类,将其识别成对应的字符。分类器一般需要提前训练,常见的分类器有:支持向量机、神经网络等。后处理:是对分类结果进行优化处理的步骤。经过分类器分类得到的结果是不完全准确的,比如对形近字的识别错误率比较高、识别结果存在排版错误,后处理就可以有针对性地解决这些问题。例如,通过语言模型校正将“存哪里”校正为“在哪里”,并对识别结果进行格式化。
  03
  正则表达式是什么
  
  正则表达式在人物场景中承担的是什么责任呢?经过前面叙述的流程,从图片中提取出来的文字信息,需要进一步整理提取,实现自动化核查。正则表达式通常被用来检索、替换符合特定模式的文本。正则表达式可以提取出文本中的特定文本,即:姓名、证件号码、采样时间、检测结果等,再输出到Excel中。
  04
  OCR数据集
  
  目前主流的OCR任务会使用深度学习方法,这意味着数据集是其中的关键。
  文本检测数据集SynthText:~vgg/data/scenetext/ICDAR是竞赛数据集,2003年、2013年、2015年、2017年分别开放了以下数据集:谷歌图像中收集整理得到的IIIT 5K words数据集:还有一些公开数据集,如:SVT、CUTE等。Github上有一个OCR数据汇总可以查看:大多数OCR数据集包含的图像数量比较少,并不足以训练出一个模型,需要合成新的数据集使用。
  05
  小结
  
  OCR技术不算是最新的技术,早在十年前它就火过,随着近年深度学习的迅速发展,基于深度学习的OCR技术也逐渐成熟,能够更好更灵活地应对不同场景,已经成为科技公司的能力标配。
  进技术交流群请添加AINLP小助手微信(id: ainlper)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />请备注具体方向+所用到的相关技术点<p style="margin-top: 15px;margin-bottom: 15px;outline: 0px;max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;widows: 1;caret-color: rgb(51, 51, 51);white-space: pre-line;line-height: 30px;color: rgb(74, 74, 74);font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif;overflow-wrap: break-word !important;">关于AINLP
  AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
  <br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
  
  阅读至此了,分享、点赞、在看三选一吧</p>

正则代理001-正则表达式的介绍、详细用法和注意事项

网站优化优采云 发表了文章 • 0 个评论 • 106 次浏览 • 2022-05-14 19:01 • 来自相关话题

  正则代理001-正则表达式的介绍、详细用法和注意事项
  php正则函数抓取网页连接:正则代理001-正则表达式的介绍、详细用法和注意事项。正则表达式的介绍002-正则表达式的详细用法和注意事项。
  正则表达式总结下来说,是对匹配的文本字符串中的某些字符进行匹配,找到与这些字符相匹配的字符串的过程。其实正则表达式很简单,就是找一些数字/字母/特殊字符等等一些字符组成的字符串匹配规则,然后进行匹配即可。无非就是先分好类,找到要匹配的文本字符,然后匹配就完事儿了。常用的常用的正则表达式有re.search(发现目标字符串),re.exec(找到文本字符串中对应字符的过程),re.siblings(匹配一对一匹配的关系),re.sub(匹配一对多的关系),match(查找给定匹配中的一个字符串)等等。
  这些都是很常用的,尤其是最后的查找给定匹配中的一个字符串。(正则表达式给定匹配中的一个字符串)基本上我们常用的正则表达式都有一些固定的模式,这些固定的模式也就是正则表达式本身的长度参数,这个也很好理解,比如'aaaa',那是匹配a的那一个,自然这里就匹配aa这个字符串。然后把aa,g这些模式串成一个整体,也就是这一长串字符串,那么就是一个a类似整数的集合,如果把'aaaa'映射一个整数集合,就是a,-1,1,2,2,-4,4等等,自然结果就会是0到200000000了。
  也就是常用正则匹配的字符串长度参数的个数。然后如果有一些正则字符,还有个别的一些特殊字符或者汉字,这里有个构成的模式的个数,这个也就是正则表达式的参数个数,比如re.s,re.replace,re.table,bin等等。本质上来说,模式就是各种匹配到特定结果的匹配规则。(正则表达式匹配规则的个数)总之我们对正则表达式就是各种参数,以及各种参数组合串成的整体。
  匹配规则个数会有所不同,也就是正则表达式的长度参数个数会不同。常用的匹配规则还有aa,ff,gj这些特殊,a,g,j,r,e这些常用字符。其实也可以等价与c语言常用的ao,eo等等正则表达式语法。手机码字,格式见谅。上面其实就是最常用的正则表达式,至于函数,那更多了,只列一点比较常用的比较常用的。3w1r,hire,pipeline,find(find同width),find(find同finger),join(join同concat),replace(replace同concat),text(text同concat),text(text同join),white(white同concat),book(white同c。 查看全部

  正则代理001-正则表达式的介绍、详细用法和注意事项
  php正则函数抓取网页连接:正则代理001-正则表达式的介绍、详细用法和注意事项。正则表达式的介绍002-正则表达式的详细用法和注意事项。
  正则表达式总结下来说,是对匹配的文本字符串中的某些字符进行匹配,找到与这些字符相匹配的字符串的过程。其实正则表达式很简单,就是找一些数字/字母/特殊字符等等一些字符组成的字符串匹配规则,然后进行匹配即可。无非就是先分好类,找到要匹配的文本字符,然后匹配就完事儿了。常用的常用的正则表达式有re.search(发现目标字符串),re.exec(找到文本字符串中对应字符的过程),re.siblings(匹配一对一匹配的关系),re.sub(匹配一对多的关系),match(查找给定匹配中的一个字符串)等等。
  这些都是很常用的,尤其是最后的查找给定匹配中的一个字符串。(正则表达式给定匹配中的一个字符串)基本上我们常用的正则表达式都有一些固定的模式,这些固定的模式也就是正则表达式本身的长度参数,这个也很好理解,比如'aaaa',那是匹配a的那一个,自然这里就匹配aa这个字符串。然后把aa,g这些模式串成一个整体,也就是这一长串字符串,那么就是一个a类似整数的集合,如果把'aaaa'映射一个整数集合,就是a,-1,1,2,2,-4,4等等,自然结果就会是0到200000000了。
  也就是常用正则匹配的字符串长度参数的个数。然后如果有一些正则字符,还有个别的一些特殊字符或者汉字,这里有个构成的模式的个数,这个也就是正则表达式的参数个数,比如re.s,re.replace,re.table,bin等等。本质上来说,模式就是各种匹配到特定结果的匹配规则。(正则表达式匹配规则的个数)总之我们对正则表达式就是各种参数,以及各种参数组合串成的整体。
  匹配规则个数会有所不同,也就是正则表达式的长度参数个数会不同。常用的匹配规则还有aa,ff,gj这些特殊,a,g,j,r,e这些常用字符。其实也可以等价与c语言常用的ao,eo等等正则表达式语法。手机码字,格式见谅。上面其实就是最常用的正则表达式,至于函数,那更多了,只列一点比较常用的比较常用的。3w1r,hire,pipeline,find(find同width),find(find同finger),join(join同concat),replace(replace同concat),text(text同concat),text(text同join),white(white同concat),book(white同c。

webshell免杀——以PHP为例

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-05-10 23:45 • 来自相关话题

  webshell免杀——以PHP为例
  介
  (2)从远程URL中获取数据
  file_get_contents、curl、svn_checkout…
  将需要执行的指令数据放在远程URL中,通过URL_INCLUDE来读取
  (3)从磁盘文件中获取数据
  file、file_get_contents…
  将需要执行的指令数据放在磁盘文件中,利用IO函数来读取
  (4)从数据库中读取
  将需要执行的指令放在数据库中,利用数据库函数来读取
  (5)从图片头部中获取
  exif_read_data…
  将需要执行的指令数据放在图片头部中,利用图片操作函数来读取
  2、代码执行
  (1)常用命令执行函数
  eval、system、assert、exec、shell_exec…
  最普通、标准的代码执行
  (2)LFI
  include、require…
  利用浏览器的伪协议将文件包含转化为代码执行
  (3)动态函数执行
  $()…
  PHP的动态函数特性
  (4)Curly Syntax
  ${${…}}…
  这种思路可以把变量赋值的漏洞转化为代码执行的机会
  3、PHP一句话
  最常见的就是eval和assert:
  一些常见方法:
  二、关于WAF
  要免杀,当然得先了解是谁在杀,主要是D盾、安全狗,护卫神等,其他还有杀毒软件如火绒、360
  其检测思路大概有:
  1、基于流量和字符特征的检测
  既然是字符特征,首先就是对于一些危险函数(上面提到的那些)的检测:
  还有popen ,curl_exec,curl_multi_exec,parse_ini_file,show_source等
  然后是在返回包中检测特殊字符:root或者是其他一些敏感字符串passwd等等
  2、基于文件特征
  主要基于HASH的匹配,取决于样本的捕捉能力及形成特征列表的数量,还是会出现漏报问题。
  这里会对上传上来的文件进行分片处理,之后会对每一个片段进行hash计算,在得到所有片段的hash值后会和之前有的特征列表库进行对比。如果符合某个相似度的要求就认为该文件为webshell。
  3、基于AST语义分析
  为了弥补统计特征的不足,进一步深化,进行语法检测,关注于每个函数和参数,这种方式精确,误报较少。但是对于PHP这种动态特性很多的语言,检测就比较吃力,AST是无法了解语义的。
  其实这一部分有点类似于代码审计,核心问题就是找到那些可疑的函数。有经验的安全人员可能脑海里就有一个表,这个表里放满了各种函数,有点类似于黑名单。在找到函数调用的代码时,如果发现函数名在黑名单中,就认为这是一个“敏感”函数,再执行后续判断;如果函数名不在黑名单中,那么后续的判断也就不用继续了。但是这个名单必须得大而全,而且得考虑很多特殊情况。
  4、动/静态符号执行
  实际是就是去发现没有过滤或者过滤不完全的可控变量,一但存在用户可以控制的代码逻辑,那么危险系数就很高了。
  5、机器学习
  这个需要大量的webshell样本训练,目前来看效果可能还是不太好。而有些算法可解释性比较差,不利于运营。而且存在大量误报的可能。
  6、终极检测引擎Rasp
  在2014年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP。它是一种新型应用安全保护技术,它将保护程序像疫苗一样注入到应用程序中,应用程序融为一体,能实时检测和阻断安全攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预。
  RASP技术可以快速的将安全防御功能整合到正在运行的应用程序中,它拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。
  三、免杀思路
  下面是一些免杀的思路,但实际需要多种思路结合,办法总比困难多
  1、字符串变换
  将关键词进行拼接转换等,来绕过对关键词的检测
  一些可用的方法有:
  ucwords() //函数把字符串中每个单词的首字符转换为大写。ucfirst() //函数把字符串中的首字符转换为大写。trim() //函数从字符串的两端删除空白字符和其他预定义字符。substr_replace() //函数把字符串的一部分替换为另一个字符串substr() //函数返回字符串的一部分。strtr() //函数转换字符串中特定的字符。strtoupper() //函数把字符串转换为大写。strtolower() //函数把字符串转换为小写。strtok() //函数把字符串分割为更小的字符串str_rot13() //函数对字符串执行 ROT13 编码。
  由于eval是语言构造器而不是函数,所以不能被可变函数调用,一般会通过拼接assert来执行;又由于assert在php7.1之后无法这样使用,所以此类免杀方式基本仅能在php5环境下使用
  几个例子: <p> 查看全部

  webshell免杀——以PHP为例
  介
  (2)从远程URL中获取数据
  file_get_contents、curl、svn_checkout…
  将需要执行的指令数据放在远程URL中,通过URL_INCLUDE来读取
  (3)从磁盘文件中获取数据
  file、file_get_contents…
  将需要执行的指令数据放在磁盘文件中,利用IO函数来读取
  (4)从数据库中读取
  将需要执行的指令放在数据库中,利用数据库函数来读取
  (5)从图片头部中获取
  exif_read_data…
  将需要执行的指令数据放在图片头部中,利用图片操作函数来读取
  2、代码执行
  (1)常用命令执行函数
  eval、system、assert、exec、shell_exec…
  最普通、标准的代码执行
  (2)LFI
  include、require…
  利用浏览器的伪协议将文件包含转化为代码执行
  (3)动态函数执行
  $()…
  PHP的动态函数特性
  (4)Curly Syntax
  ${${…}}…
  这种思路可以把变量赋值的漏洞转化为代码执行的机会
  3、PHP一句话
  最常见的就是eval和assert:
  一些常见方法:
  二、关于WAF
  要免杀,当然得先了解是谁在杀,主要是D盾、安全狗,护卫神等,其他还有杀毒软件如火绒、360
  其检测思路大概有:
  1、基于流量和字符特征的检测
  既然是字符特征,首先就是对于一些危险函数(上面提到的那些)的检测:
  还有popen ,curl_exec,curl_multi_exec,parse_ini_file,show_source等
  然后是在返回包中检测特殊字符:root或者是其他一些敏感字符串passwd等等
  2、基于文件特征
  主要基于HASH的匹配,取决于样本的捕捉能力及形成特征列表的数量,还是会出现漏报问题。
  这里会对上传上来的文件进行分片处理,之后会对每一个片段进行hash计算,在得到所有片段的hash值后会和之前有的特征列表库进行对比。如果符合某个相似度的要求就认为该文件为webshell。
  3、基于AST语义分析
  为了弥补统计特征的不足,进一步深化,进行语法检测,关注于每个函数和参数,这种方式精确,误报较少。但是对于PHP这种动态特性很多的语言,检测就比较吃力,AST是无法了解语义的。
  其实这一部分有点类似于代码审计,核心问题就是找到那些可疑的函数。有经验的安全人员可能脑海里就有一个表,这个表里放满了各种函数,有点类似于黑名单。在找到函数调用的代码时,如果发现函数名在黑名单中,就认为这是一个“敏感”函数,再执行后续判断;如果函数名不在黑名单中,那么后续的判断也就不用继续了。但是这个名单必须得大而全,而且得考虑很多特殊情况。
  4、动/静态符号执行
  实际是就是去发现没有过滤或者过滤不完全的可控变量,一但存在用户可以控制的代码逻辑,那么危险系数就很高了。
  5、机器学习
  这个需要大量的webshell样本训练,目前来看效果可能还是不太好。而有些算法可解释性比较差,不利于运营。而且存在大量误报的可能。
  6、终极检测引擎Rasp
  在2014年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP。它是一种新型应用安全保护技术,它将保护程序像疫苗一样注入到应用程序中,应用程序融为一体,能实时检测和阻断安全攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预。
  RASP技术可以快速的将安全防御功能整合到正在运行的应用程序中,它拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。
  三、免杀思路
  下面是一些免杀的思路,但实际需要多种思路结合,办法总比困难多
  1、字符串变换
  将关键词进行拼接转换等,来绕过对关键词的检测
  一些可用的方法有:
  ucwords() //函数把字符串中每个单词的首字符转换为大写。ucfirst() //函数把字符串中的首字符转换为大写。trim() //函数从字符串的两端删除空白字符和其他预定义字符。substr_replace() //函数把字符串的一部分替换为另一个字符串substr() //函数返回字符串的一部分。strtr() //函数转换字符串中特定的字符。strtoupper() //函数把字符串转换为大写。strtolower() //函数把字符串转换为小写。strtok() //函数把字符串分割为更小的字符串str_rot13() //函数对字符串执行 ROT13 编码。
  由于eval是语言构造器而不是函数,所以不能被可变函数调用,一般会通过拼接assert来执行;又由于assert在php7.1之后无法这样使用,所以此类免杀方式基本仅能在php5环境下使用
  几个例子: <p>

php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-05-10 23:39 • 来自相关话题

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS 查看全部

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS

PHP代码审计之敏感函数参数回溯法

网站优化优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-05-03 01:27 • 来自相关话题

  PHP代码审计之敏感函数参数回溯法
  ‍‍前言
  代码审计,是对应用程序源代码进行系统性检查的工作。目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。
  代码审计常用工具
  
  Seay源代码审计系统、Fortify SCA、RIPS
  
  敏感函数参数回溯法
  
  根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的。我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。这方面,Seay法师大大有一款神器Seay源代码审计系统,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。然后,我们就可以分析判断敏感函数的上下文,追踪参数源头。
  (1) 根据敏感关键字回溯参数传递过程。
  (2) 查找可控变量,正向追踪变量传递过程。
  (3) 寻找敏感功能点,通读功能点代码、
  (4) 直接通读全文代码
  
  回溯过程
  
  这里用seay源代码审计系统举例:
  打开某CMS源代码,先点击新建项目
  
  选择解压出来的源代码的根目录,然后点击确定
  
  点击自动审计,再点击开始
  
  可以看到自动审计根据敏感函数列出了可能存在的漏洞
  
  
  敏感函数列举
  
  函数回溯发审计常用漏洞
  Xss 审计:
  1.反射xss一般seay可以直接搜索str_replace关键字,也可以通过手工搜索来寻找
  2.存储型 XSS全局搜索数据库的插入语句(关键词:insert,save,update),然后找到该插入语句所属的方法名如 (insertUser()),然后全局搜索该方法在哪里被调用,一层层的跟踪
  SQL 注入:
  一般直接搜索select、update、delete、insert 关键词就会有收获,如果 sql 语句中有出现+、 append、 $、 ()、 # 等字眼,如果没有配置SQL 过滤文件,则判断存在 SQL 注入漏洞
  任意文件下载:
  审计方法:全局搜索以下关键词 fileName、filePath、getFile、getWriter、download
  查看下载文件或路径是否可控
  文件上传:
  文件上传可以搜索以下关键词:(需注意有没有配置文件上传白名单)
  upload、write、fileName 、filePath
  在查看时,主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单
  文件包含:
  直接搜索include、require、include_once、require_once
  Ssrf:
  搜索函数跟踪请求file_get_contents、fsockopen、curl_exec
  CSRF:
  审计方法:通过查看配置文件有没有配置 csrf 全局过滤器,如果没有则重点看每个操作前有没有添加 token 的防护机制
  
  审计思路
  
  先用小皮搭建好我们的cms用来复现漏洞
  
  安装完成
  开始审计
  后台链接添加处admin/link.php ,siteurl参数输出时未进行实体化处理导致,存储型xss。在$action=addlink时,通过addslashes函数进行转义处理,防止进行sql注入,但是未进行任何的html实体化,或者过滤处理。通过第44行代码可发现进行了正则匹配所以我们构造的payload需以http、ftp开头,才能进型数据插入。
  
  通过addLink函数插入链接,接下来跟进/include/model/link_model.php中的link_Model-&gt;addLink函数,该函数将经过addslashes转义完的链接插入数据库 进行存储。
  
  接下来跟进输出情况,当action参数为空,通过/include/model/link_model.php中的Link_Model-&gt;getLinks()函数从数据库查询sitename、description、siteurl,并返回查询结果,最后由View::output()进行输出。getLinks()函数查询数据库获取,获取sitename、description、siteurl数据,查看可发现未对siteurl参数进行实体化和过滤处理。
  
  查看/include/lib/view.php 中的View::output函数,最后结果通过echo输出,在整个过程都未对siteurl进行实体化、过滤处理,导致最终造成存储型xss。
  
  验证一下‍‍
  
  
   查看全部

  PHP代码审计之敏感函数参数回溯法
  ‍‍前言
  代码审计,是对应用程序源代码进行系统性检查的工作。目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。
  代码审计常用工具
  
  Seay源代码审计系统、Fortify SCA、RIPS
  
  敏感函数参数回溯法
  
  根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的。我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。这方面,Seay法师大大有一款神器Seay源代码审计系统,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。然后,我们就可以分析判断敏感函数的上下文,追踪参数源头。
  (1) 根据敏感关键字回溯参数传递过程。
  (2) 查找可控变量,正向追踪变量传递过程。
  (3) 寻找敏感功能点,通读功能点代码、
  (4) 直接通读全文代码
  
  回溯过程
  
  这里用seay源代码审计系统举例:
  打开某CMS源代码,先点击新建项目
  
  选择解压出来的源代码的根目录,然后点击确定
  
  点击自动审计,再点击开始
  
  可以看到自动审计根据敏感函数列出了可能存在的漏洞
  
  
  敏感函数列举
  
  函数回溯发审计常用漏洞
  Xss 审计:
  1.反射xss一般seay可以直接搜索str_replace关键字,也可以通过手工搜索来寻找
  2.存储型 XSS全局搜索数据库的插入语句(关键词:insert,save,update),然后找到该插入语句所属的方法名如 (insertUser()),然后全局搜索该方法在哪里被调用,一层层的跟踪
  SQL 注入:
  一般直接搜索select、update、delete、insert 关键词就会有收获,如果 sql 语句中有出现+、 append、 $、 ()、 # 等字眼,如果没有配置SQL 过滤文件,则判断存在 SQL 注入漏洞
  任意文件下载:
  审计方法:全局搜索以下关键词 fileName、filePath、getFile、getWriter、download
  查看下载文件或路径是否可控
  文件上传:
  文件上传可以搜索以下关键词:(需注意有没有配置文件上传白名单)
  upload、write、fileName 、filePath
  在查看时,主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单
  文件包含:
  直接搜索include、require、include_once、require_once
  Ssrf:
  搜索函数跟踪请求file_get_contents、fsockopen、curl_exec
  CSRF:
  审计方法:通过查看配置文件有没有配置 csrf 全局过滤器,如果没有则重点看每个操作前有没有添加 token 的防护机制
  
  审计思路
  
  先用小皮搭建好我们的cms用来复现漏洞
  
  安装完成
  开始审计
  后台链接添加处admin/link.php ,siteurl参数输出时未进行实体化处理导致,存储型xss。在$action=addlink时,通过addslashes函数进行转义处理,防止进行sql注入,但是未进行任何的html实体化,或者过滤处理。通过第44行代码可发现进行了正则匹配所以我们构造的payload需以http、ftp开头,才能进型数据插入。
  
  通过addLink函数插入链接,接下来跟进/include/model/link_model.php中的link_Model-&gt;addLink函数,该函数将经过addslashes转义完的链接插入数据库 进行存储。
  
  接下来跟进输出情况,当action参数为空,通过/include/model/link_model.php中的Link_Model-&gt;getLinks()函数从数据库查询sitename、description、siteurl,并返回查询结果,最后由View::output()进行输出。getLinks()函数查询数据库获取,获取sitename、description、siteurl数据,查看可发现未对siteurl参数进行实体化和过滤处理。
  
  查看/include/lib/view.php 中的View::output函数,最后结果通过echo输出,在整个过程都未对siteurl进行实体化、过滤处理,导致最终造成存储型xss。
  
  验证一下‍‍
  
  
  

记一次反编译小程序寻找签名函数并联动bp插件自动化加签

网站优化优采云 发表了文章 • 0 个评论 • 93 次浏览 • 2022-05-02 04:25 • 来自相关话题

  记一次反编译小程序寻找签名函数并联动bp插件自动化加签
  文章首发于:
  火线Zone社区()
  0x00 前言
  日常渗透测试中,在进行数据包的重放或者是篡改数据包时,会碰到一些存在数据加密或加签的站点,这时我们就得寻找加签或者加密的算法,而这寻找过程往往有一定难度。
  总的来讲,对于数据解密或者加签破解的难度:app&gt;web≥wxapp,同时api接口都是相同的,为降低不必要的挖洞难度,可将目光放到微信小程序上。本次就是以一个微信小程序站点开展的测试。
  0x01 拖取微信小程序包
  这里简单说下,目前微信小程序在pc端貌似已经有加密了,Mac(/Users/{系统用户名}/Library/Containers/com.tencent.xinWeChat/Data/Library/Containers/com.tencent.xinWeChat/Data/Library/Caches/com.tencent.xinWeChat/{微信版本号}/{用户ID}/WeApp/LocalCache/release/{小程序ID}/)、Windows(C:\Users\{系统用户名}\Documents\WeChat Files\Applet\{小程序ID}\),而我们这边可以去拖安卓端的小程序包。
  这里需要提前准备好一个已经root过的安卓手机或者是一个安卓模拟器,先去/data/data/com.tencent.mm/MicroMsg/{一串16进制字符}/appbrand/pkg 这个目录下将其他小程序包都删除掉,然后再打开微信加载我们需要测试的目标小程序。
  此处注意,一定要等小程序完全打开并且再点几个功能,确保将所有包都运行,由于目前的小程序体量逐渐变大,可能会有多个子包的存在。
  
  
  然后将相关子包拖出来。
  0x02 反编译小程序拿源码
  在将相关子包拖出来并放在我们指定的目录,然后用wxappUnpacker工具将包反编译出来。
  node wuWxapkg.js ../20220323/debug_607957350_2_511127914.wxapkg
  在原本存放小程序的目录下会出现一个以小程序包名的子文件夹,反编译出来的源码就在里面。
  
  用微信官方开发工具打开源码项目:
  1、选择“导入项目”,“AppID”选择测试号并导入
  2、到“本地设置”模块,勾选上“不校验合法域名”功能
  
  
  0x03 寻找签名加密函数
  案例背景环境
  介绍一下本次示例案例的背景环境。
  在这⾥通过抓包发现站点有使⽤签名来鉴定提交数据的完整性, 经⼿⼯测试,发现修改任意带有值的参数,都会导致服务器端报错提示"签名错误”
  
  
  这里简单介绍一种快速定位JavaScript中关键加密函数的方法--关键字寻找
  关键字寻找
  1.1、在项目中全局搜索关键字
  常见的通用关键字例如key、encrypt、iv、sign、password、rsa、aes等
  1.2、搜索加签加密接口名
  例如此处接口名为/xxxxxxing1/f**dinfo/getfundranklist/1.0,可以搜其拆分的路由名称:xxxxxxing1f**dinfogetfundranklist
  1.3、搜索相关涉及到加签加密的参数名
  例如此处则可以搜索oftypeopenapi_signparamsDigestordercol等
  在介绍完背景和方法后,可以开始寻找加签函数了。
  定位加签函数
  在相关开发者工具中,全局搜索openapi
  
  发现有两个js存在,进入这两个js继续定位关键的位置。
  发现openapi关键字都存在于同一个关键函数(说明:这里后面经过对比两个js文件,发现内容大致相同而app-service.js不存在乱码情况,故后面都以此js进行跟踪分析)
  
  openapi_sign参数存在于getSecretSign方法中,同时另外⼀个请求体里的参数paramsDigest也 在⾥⾯,这根据这个命名⼤概推测该⽅法可能是⽤于签名。
  
  继续搜索此方法名getSecretSign,看看该方法是否有被调用到,发现了关键形参:t.data、 r.secretkey。
  
  继续上下⽂搜索t.data,发现⼀个关键点,阅读相关js代码,发现⾥⾯的 json字符串就是从数据包参数 ⾥⾯获取的,然后调⽤Object.assign⽅法将json串复制到t.data当中。
  
  由于r.secretkey未能搜索到,故尝试搜索secretkey关键字看看能不能找到些啥,发现刚好存在 ⼀个secretkey,至此可以⼤致判定我们最初找的getSecretSign为加签⽅法。
  
  0x04 编写加签函数
  本地起一个js脚本,将0x03中找到的加签函数写入,提供必要的参数值,运行测试下。
  
  结果报错提示r对象未被定义,阅读代码发现,r对象只是用于提供它的hex()方法,返回项目源码当中寻找hex()方法。
  
  然后往上面跟代码发现此处是引用了github上的一个MD5加密算法github。
  这里直接将src目录下的md5代码复制下来,贴到我们测试的js文件当中。
  
  执行js脚本文件,无报错。同时对⽐发现签名⼀致。⾄此相关加签函数已找到并能成功调⽤运⾏。
  
  
  0x05 联动burp插件
  加签算法已破解,为了能更提高实际渗透测试过程中的效率,可以联动burp插件,使得当我们篡改数据时能自动化的运行加签算法,直接得到相关签名。
  在这里我首先尝试了burpCrypto插件,但调试js阶段发现一直有报错,同时在插件上未找到详细错误信息,而jsencrypter会将错误信息直接地抛出在命令行页面上,更有利于代码调试,故此处选择的是jsencrypter插件。
  简单介绍一下jsencrypter插件:
  
  jsencrypter使用phantomjs启动前端加密函数对数据进行加密,方便对加密数据输入点进行fuzz,比如可以使用于前端加密传输爆破等场景。工具本身提供了几种常见加密算法,可以直接引用,当加密加签算法为非常规时,也可以引用我们自定义算法进行破解。
  phantomjs是已停产的无头浏览器,用于自动进行网页交互。PhantomJS提供了一个JavaScript API,可实现自动导航,屏幕截图,用户行为和断言,使其成为在无头系统(如持续集成环境)中运行基于浏览器的单元测试的常用工具。
  Jsencrypter的使用
  按照插件的说明,复制了一份原来的phantomJS调用模板,按照文档注释说明,修改了引用的js文件,以及后续调用的方法。
  
  在⽤于加签的js中,将在0x04章节中成功加签的js代码复制过来,并在后面给其设置一个get方法,用于返回签名。
  function get(pass){     var pass1 = eval("("+pass+")");     var call = test(pass1,t);     var str = 'paramsDigest:'+call.paramsDigest+'-------'+'openapi_sign:'+call.openapi_sign;     return str;     }
  命令行中敲入命令,运行phantomjs
  >phantomjs js1.js[*] load js successful[!] ^_^[*] jsEncrypterJS start![+] address: http://127.0.0.1:1664
  然后bp上点击test发送数据,可以看到相关的sign值完全正确。(此处sign值与前面图对应)
  
  自动化改进
  原先js脚本,只是回显了sign,但实际过程中,我们还是需要cv⼤法将openapi_signparamsDigest以及我们篡改后的数据串值重新丢⼊repeater中,其实可以通过js正则,进⾏修改输出,省去这⼀步。
  首先定义一个unchange方法,用于将json串转成参数串。
  function unchange(b){  var str = b,p1;  p1 = str.split(':"').join('=');  p1 = p1.split('",').join('&');  p1 = p1.replace('{','');  p1 = p1.replace('"}','');  return p1;}
  然后连接符+缝合起来
       var str = unchange(pass)+'&paramsDigest='+call.paramsDigest+'&openapi_sign='+call.openapi_sign;     return str;
  看看实际效果
  
  可以直接在插件上篡改参数值,然后复制结果到repeater中进行安全测试。
  
  自动化改进2
  但是这个地方,我们还是需要将数据先转化成非标准的json字符串。这里我尝试了在插件里面的js中进行修改,但是由于相关数据本身就包括了xxx&amp;xxx1&amp;xxx2,而&amp;在HTTP请求中会当做一个分割参数符,这会导致参数传到server端中时,只剩下一个xxx参数,其余的都被丢弃了。
  这里本想先将数据base编码,再传输过去,但思考下其实多此一举,在调用插件前还需要编码,加密前还需要先解码,这更复杂,还不如直接写个js,将数据转成json字符串后再丢给插件。
  故使用曲线救国的方式,写了一个js,用于自动化生成json串。
  function change(b){  var str = b,p1;  p1 = str.split('=').join(':"');  p1 = p1.split('&').join('",');  p1 = p1.replace(/^/,'{');  p1 = p1.replace(/$/,'"}');  return p1;}<br />var str = 'secuid=JY208740&udid=&sysVer=5.7.7&appName=&systemInfo=%2C%2C%2C&softName=WXIN_O&tradeClient=H5Trade&device_model=&deviceVers=&hwID=&conn_style=2.460.01.0.0&mip=&mac=&imsi=&iccid=&rNetAddr=&packtm=&reqtime=&operway=W&operorg=&netAddr=13888888888&session=12f4530351a3********7b6d8dec3c36f60dce1e83e03329d42fc269&userCode=334507******1792&pkg=H_117292&fundid=';  console.log(change(str));
  
  至此,除了需要手动执行转化数据串为json串外,勉强实现了自动化修改数据(不是
  0x06 涉及到的工具下载方式
  以上工具可到原文中下载:
  包含以下工具:
  第一次写文章,有什么不对的地方还请各位师傅斧正。
  【火线Zone云安全社区群】
  进群可以与技术大佬互相交流
  进群有机会免费领取节假日礼品 查看全部

  记一次反编译小程序寻找签名函数并联动bp插件自动化加签
  文章首发于:
  火线Zone社区()
  0x00 前言
  日常渗透测试中,在进行数据包的重放或者是篡改数据包时,会碰到一些存在数据加密或加签的站点,这时我们就得寻找加签或者加密的算法,而这寻找过程往往有一定难度。
  总的来讲,对于数据解密或者加签破解的难度:app&gt;web≥wxapp,同时api接口都是相同的,为降低不必要的挖洞难度,可将目光放到微信小程序上。本次就是以一个微信小程序站点开展的测试。
  0x01 拖取微信小程序包
  这里简单说下,目前微信小程序在pc端貌似已经有加密了,Mac(/Users/{系统用户名}/Library/Containers/com.tencent.xinWeChat/Data/Library/Containers/com.tencent.xinWeChat/Data/Library/Caches/com.tencent.xinWeChat/{微信版本号}/{用户ID}/WeApp/LocalCache/release/{小程序ID}/)、Windows(C:\Users\{系统用户名}\Documents\WeChat Files\Applet\{小程序ID}\),而我们这边可以去拖安卓端的小程序包。
  这里需要提前准备好一个已经root过的安卓手机或者是一个安卓模拟器,先去/data/data/com.tencent.mm/MicroMsg/{一串16进制字符}/appbrand/pkg 这个目录下将其他小程序包都删除掉,然后再打开微信加载我们需要测试的目标小程序。
  此处注意,一定要等小程序完全打开并且再点几个功能,确保将所有包都运行,由于目前的小程序体量逐渐变大,可能会有多个子包的存在。
  
  
  然后将相关子包拖出来。
  0x02 反编译小程序拿源码
  在将相关子包拖出来并放在我们指定的目录,然后用wxappUnpacker工具将包反编译出来。
  node wuWxapkg.js ../20220323/debug_607957350_2_511127914.wxapkg
  在原本存放小程序的目录下会出现一个以小程序包名的子文件夹,反编译出来的源码就在里面。
  
  用微信官方开发工具打开源码项目:
  1、选择“导入项目”,“AppID”选择测试号并导入
  2、到“本地设置”模块,勾选上“不校验合法域名”功能
  
  
  0x03 寻找签名加密函数
  案例背景环境
  介绍一下本次示例案例的背景环境。
  在这⾥通过抓包发现站点有使⽤签名来鉴定提交数据的完整性, 经⼿⼯测试,发现修改任意带有值的参数,都会导致服务器端报错提示"签名错误”
  
  
  这里简单介绍一种快速定位JavaScript中关键加密函数的方法--关键字寻找
  关键字寻找
  1.1、在项目中全局搜索关键字
  常见的通用关键字例如key、encrypt、iv、sign、password、rsa、aes等
  1.2、搜索加签加密接口名
  例如此处接口名为/xxxxxxing1/f**dinfo/getfundranklist/1.0,可以搜其拆分的路由名称:xxxxxxing1f**dinfogetfundranklist
  1.3、搜索相关涉及到加签加密的参数名
  例如此处则可以搜索oftypeopenapi_signparamsDigestordercol等
  在介绍完背景和方法后,可以开始寻找加签函数了。
  定位加签函数
  在相关开发者工具中,全局搜索openapi
  
  发现有两个js存在,进入这两个js继续定位关键的位置。
  发现openapi关键字都存在于同一个关键函数(说明:这里后面经过对比两个js文件,发现内容大致相同而app-service.js不存在乱码情况,故后面都以此js进行跟踪分析)
  
  openapi_sign参数存在于getSecretSign方法中,同时另外⼀个请求体里的参数paramsDigest也 在⾥⾯,这根据这个命名⼤概推测该⽅法可能是⽤于签名。
  
  继续搜索此方法名getSecretSign,看看该方法是否有被调用到,发现了关键形参:t.data、 r.secretkey。
  
  继续上下⽂搜索t.data,发现⼀个关键点,阅读相关js代码,发现⾥⾯的 json字符串就是从数据包参数 ⾥⾯获取的,然后调⽤Object.assign⽅法将json串复制到t.data当中。
  
  由于r.secretkey未能搜索到,故尝试搜索secretkey关键字看看能不能找到些啥,发现刚好存在 ⼀个secretkey,至此可以⼤致判定我们最初找的getSecretSign为加签⽅法。
  
  0x04 编写加签函数
  本地起一个js脚本,将0x03中找到的加签函数写入,提供必要的参数值,运行测试下。
  
  结果报错提示r对象未被定义,阅读代码发现,r对象只是用于提供它的hex()方法,返回项目源码当中寻找hex()方法。
  
  然后往上面跟代码发现此处是引用了github上的一个MD5加密算法github。
  这里直接将src目录下的md5代码复制下来,贴到我们测试的js文件当中。
  
  执行js脚本文件,无报错。同时对⽐发现签名⼀致。⾄此相关加签函数已找到并能成功调⽤运⾏。
  
  
  0x05 联动burp插件
  加签算法已破解,为了能更提高实际渗透测试过程中的效率,可以联动burp插件,使得当我们篡改数据时能自动化的运行加签算法,直接得到相关签名。
  在这里我首先尝试了burpCrypto插件,但调试js阶段发现一直有报错,同时在插件上未找到详细错误信息,而jsencrypter会将错误信息直接地抛出在命令行页面上,更有利于代码调试,故此处选择的是jsencrypter插件。
  简单介绍一下jsencrypter插件:
  
  jsencrypter使用phantomjs启动前端加密函数对数据进行加密,方便对加密数据输入点进行fuzz,比如可以使用于前端加密传输爆破等场景。工具本身提供了几种常见加密算法,可以直接引用,当加密加签算法为非常规时,也可以引用我们自定义算法进行破解。
  phantomjs是已停产的无头浏览器,用于自动进行网页交互。PhantomJS提供了一个JavaScript API,可实现自动导航,屏幕截图,用户行为和断言,使其成为在无头系统(如持续集成环境)中运行基于浏览器的单元测试的常用工具。
  Jsencrypter的使用
  按照插件的说明,复制了一份原来的phantomJS调用模板,按照文档注释说明,修改了引用的js文件,以及后续调用的方法。
  
  在⽤于加签的js中,将在0x04章节中成功加签的js代码复制过来,并在后面给其设置一个get方法,用于返回签名。
  function get(pass){     var pass1 = eval("("+pass+")");     var call = test(pass1,t);     var str = 'paramsDigest:'+call.paramsDigest+'-------'+'openapi_sign:'+call.openapi_sign;     return str;     }
  命令行中敲入命令,运行phantomjs
  >phantomjs js1.js[*] load js successful[!] ^_^[*] jsEncrypterJS start![+] address: http://127.0.0.1:1664
  然后bp上点击test发送数据,可以看到相关的sign值完全正确。(此处sign值与前面图对应)
  
  自动化改进
  原先js脚本,只是回显了sign,但实际过程中,我们还是需要cv⼤法将openapi_signparamsDigest以及我们篡改后的数据串值重新丢⼊repeater中,其实可以通过js正则,进⾏修改输出,省去这⼀步。
  首先定义一个unchange方法,用于将json串转成参数串。
  function unchange(b){  var str = b,p1;  p1 = str.split(':"').join('=');  p1 = p1.split('",').join('&');  p1 = p1.replace('{','');  p1 = p1.replace('"}','');  return p1;}
  然后连接符+缝合起来
       var str = unchange(pass)+'&paramsDigest='+call.paramsDigest+'&openapi_sign='+call.openapi_sign;     return str;
  看看实际效果
  
  可以直接在插件上篡改参数值,然后复制结果到repeater中进行安全测试。
  
  自动化改进2
  但是这个地方,我们还是需要将数据先转化成非标准的json字符串。这里我尝试了在插件里面的js中进行修改,但是由于相关数据本身就包括了xxx&amp;xxx1&amp;xxx2,而&amp;在HTTP请求中会当做一个分割参数符,这会导致参数传到server端中时,只剩下一个xxx参数,其余的都被丢弃了。
  这里本想先将数据base编码,再传输过去,但思考下其实多此一举,在调用插件前还需要编码,加密前还需要先解码,这更复杂,还不如直接写个js,将数据转成json字符串后再丢给插件。
  故使用曲线救国的方式,写了一个js,用于自动化生成json串。
  function change(b){  var str = b,p1;  p1 = str.split('=').join(':"');  p1 = p1.split('&').join('",');  p1 = p1.replace(/^/,'{');  p1 = p1.replace(/$/,'"}');  return p1;}<br />var str = 'secuid=JY208740&udid=&sysVer=5.7.7&appName=&systemInfo=%2C%2C%2C&softName=WXIN_O&tradeClient=H5Trade&device_model=&deviceVers=&hwID=&conn_style=2.460.01.0.0&mip=&mac=&imsi=&iccid=&rNetAddr=&packtm=&reqtime=&operway=W&operorg=&netAddr=13888888888&session=12f4530351a3********7b6d8dec3c36f60dce1e83e03329d42fc269&userCode=334507******1792&pkg=H_117292&fundid=';  console.log(change(str));
  
  至此,除了需要手动执行转化数据串为json串外,勉强实现了自动化修改数据(不是
  0x06 涉及到的工具下载方式
  以上工具可到原文中下载:
  包含以下工具:
  第一次写文章,有什么不对的地方还请各位师傅斧正。
  【火线Zone云安全社区群】
  进群可以与技术大佬互相交流
  进群有机会免费领取节假日礼品

php正则函数抓取网页连接(php正则函数抓取网页连接表达式?相反,应该是选择器才更靠谱)

网站优化优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2022-04-20 02:04 • 来自相关话题

  php正则函数抓取网页连接(php正则函数抓取网页连接表达式?相反,应该是选择器才更靠谱)
  php正则函数抓取网页连接
  php正则表达式?
  相反,应该是选择器才更靠谱。选择器虽然不能响应处理,但是可以有意的识别网页的全部内容。
  原来提问者不认为正则表达式比选择器高级。好吧。这么认为的问题,就等于自问自答。如何追到上山养老的杨树林,
  正则主要用来识别网页上的文字
  php正则表达式(豆瓣)
  可以设计一个选择器的解析器
  正则(gbk)主要用于文本的识别,web服务器中使用正则表达式来查找网页上的字符串(不包括注释),将字符串中的文本提取出来。
  就是把一串文本转换成某种对应的字符串。
  你可以参考爬虫比赛的内容,
  把你的任务分解。大致可以分为图片爬取,数据库爬取,二维二度空间的网页抓取。这些任务中图片爬取和数据库抓取比较容易实现,但因为图片中的url不止一个,所以爬取出来的jpg图片的总大小要进行缩放。但二维二度空间的网页抓取就很难了,因为不止涉及到二维空间,三维空间也要考虑,而且大部分图片是扫描二维空间的,所以有可能出现抓取太频繁,甚至更新失误的情况,让人抓不到图片内容。
  那么我们可以再用正则表达式把我们的任务分解,图片爬取要涉及的是二维网页,因此我们可以在抓取二维网页时使用图片的最简单的一维正则来识别,如下:[a,b,c,d,e]这里使用的是四组正则:。
  2、
  3、
  5、7或其他正则分组,要达到和二维正则一样的识别效果。这样就可以对图片进行定位了。数据库网页中的爬取也差不多这样,但不用二维正则,要完成类似的任务要通过列表来完成,拿一个最简单的工作来说,我们假设有个java的写的客户端爬虫,里面有一个二维的数据库图片文件,通过在文件中引入这个二维文件做二维正则匹配。
  那么如果爬取的时候速度和效率比较高,我们可以把它分别上传到不同的服务器,服务器都是具有数据库访问权限的。那么这个客户端爬虫就可以多次爬取图片文件。我们可以利用这些服务器上已有的数据,提供多个任务版本,像爬取img中的整个字符串,只用爬取一个二维空间的字符串,甚至同时爬取上千个图片中的某一张(对于一个应用程序一般能支持的场景很有限)这些不同任务版本,我们都可以采用正则表达式来匹配。
  那么对于一个应用程序而言,它实际上是一个工具,用来满足我们一定的功能需求。而当我们把它作为一个程序去使用时,它就对应这工具的目的,我们可以通过正则的匹配方式来给一个应用程序分级。从而使代码在具体应用场景中不至于过于臃肿。那么是否选择正则而不用正则呢?应该是一起使用。就像上。 查看全部

  php正则函数抓取网页连接(php正则函数抓取网页连接表达式?相反,应该是选择器才更靠谱)
  php正则函数抓取网页连接
  php正则表达式?
  相反,应该是选择器才更靠谱。选择器虽然不能响应处理,但是可以有意的识别网页的全部内容。
  原来提问者不认为正则表达式比选择器高级。好吧。这么认为的问题,就等于自问自答。如何追到上山养老的杨树林,
  正则主要用来识别网页上的文字
  php正则表达式(豆瓣)
  可以设计一个选择器的解析器
  正则(gbk)主要用于文本的识别,web服务器中使用正则表达式来查找网页上的字符串(不包括注释),将字符串中的文本提取出来。
  就是把一串文本转换成某种对应的字符串。
  你可以参考爬虫比赛的内容,
  把你的任务分解。大致可以分为图片爬取,数据库爬取,二维二度空间的网页抓取。这些任务中图片爬取和数据库抓取比较容易实现,但因为图片中的url不止一个,所以爬取出来的jpg图片的总大小要进行缩放。但二维二度空间的网页抓取就很难了,因为不止涉及到二维空间,三维空间也要考虑,而且大部分图片是扫描二维空间的,所以有可能出现抓取太频繁,甚至更新失误的情况,让人抓不到图片内容。
  那么我们可以再用正则表达式把我们的任务分解,图片爬取要涉及的是二维网页,因此我们可以在抓取二维网页时使用图片的最简单的一维正则来识别,如下:[a,b,c,d,e]这里使用的是四组正则:。
  2、
  3、
  5、7或其他正则分组,要达到和二维正则一样的识别效果。这样就可以对图片进行定位了。数据库网页中的爬取也差不多这样,但不用二维正则,要完成类似的任务要通过列表来完成,拿一个最简单的工作来说,我们假设有个java的写的客户端爬虫,里面有一个二维的数据库图片文件,通过在文件中引入这个二维文件做二维正则匹配。
  那么如果爬取的时候速度和效率比较高,我们可以把它分别上传到不同的服务器,服务器都是具有数据库访问权限的。那么这个客户端爬虫就可以多次爬取图片文件。我们可以利用这些服务器上已有的数据,提供多个任务版本,像爬取img中的整个字符串,只用爬取一个二维空间的字符串,甚至同时爬取上千个图片中的某一张(对于一个应用程序一般能支持的场景很有限)这些不同任务版本,我们都可以采用正则表达式来匹配。
  那么对于一个应用程序而言,它实际上是一个工具,用来满足我们一定的功能需求。而当我们把它作为一个程序去使用时,它就对应这工具的目的,我们可以通过正则的匹配方式来给一个应用程序分级。从而使代码在具体应用场景中不至于过于臃肿。那么是否选择正则而不用正则呢?应该是一起使用。就像上。

通用方法:php正则表达式有什么用

网站优化优采云 发表了文章 • 0 个评论 • 152 次浏览 • 2022-09-21 20:14 • 来自相关话题

  通用方法:php正则表达式有什么用
  我们什么时候使用正则表达式?并非所有字符操作都使用正则表达式。 PHP 使用正则表达式在某些方面影响效率。当我们遇到复杂文本数据的解析时,使用正则表达式是更好的选择。
  PHP 零基础到就业视频直播课:
  直播+实践教学+学习+实践+辅导
  【推荐】《如何实现接口的自动化测试?单流测试,组合测试,智能测试报告! 》
  优势
  在处理复杂的字符操作时,正则表达式可以提高工作效率,在一定程度上节省你的代码。
  缺点
  当我们使用正则表达式时,复杂的正则表达式会增加代码的复杂度,使其难以理解。所以我们有时需要在正则表达式里面添加注释。
  通用模式(推荐学习:PHP编程从入门到精通)
  分隔符,通常使用“/”作为分隔符的开始和结束,也可以使用“#”。
  什么时候使用“#”?通常当你的字符串中有很多“/”字符的时候,因为这些字符是常规的时候需要转义,比如uri。
  
  使用“/”分隔符的代码如下。
  $regex = &#39;/^http:\/\/([\w.]+)\/([\w]+)\/([\w]+)\.html$/i&#39;;
$str = &#39;http://www.youku.com/show_page ... 3B%3B
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
  preg_match 中的$matches[0] 将收录匹配整个模式的字符串。
  使用“#”分隔符的代码如下。此时“/”没有转义!
  
  $regex = &#39;#^http://([\w.]+)/([\w]+)/([\w]+)\.html$#i&#39;;
$str = &#39;http://www.youku.com/show_page ... 3B%3B
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
  正则表达式的定义可以概括如下:“正则表达式描述了字符串匹配的一种模式,通过它在特定的函数中进行匹配、查找、替换、分割字符串等操作。作为一个A匹配模板是由原子、特殊功能字符和模式修饰符组成的文字模式。”
  以上是php正则表达式使用的详细内容。更多详情请关注php中文网其他相关话题文章!
  操作方法:【Web Scraper 翻页——控制链接批量抓取数据(Web Scraper
  
  Web Scraper 翻页 - 控制链接批量抓取数据(高级 Web Scraper 使用) |简单的数据分析05
  
  这是简单数据分析系列的第五部分文章。第一部分文章我们爬取了豆瓣影业TOP250的前25部电影的数据,今天我们将对原有的Web Scraper进行一些小改动,让爬虫爬取全部250部电影数据。前面我们说过,爬虫的本质是寻找规则。这些程序员在设计网页时,肯定会遵循一些规则。当我们找到规则时,我们可以预测他们的行为并实现我们的目标。今天我们就来寻找豆瓣的规则网站,想办法把所有的数据都抓起来。今天的规则从经常被忽略的 URL 链接开始。 1.链接分析我们来看看第一页的豆瓣网址链接:…… 查看全部

  通用方法:php正则表达式有什么用
  我们什么时候使用正则表达式?并非所有字符操作都使用正则表达式。 PHP 使用正则表达式在某些方面影响效率。当我们遇到复杂文本数据的解析时,使用正则表达式是更好的选择。
  PHP 零基础到就业视频直播课:
  直播+实践教学+学习+实践+辅导
  【推荐】《如何实现接口的自动化测试?单流测试,组合测试,智能测试报告! 》
  优势
  在处理复杂的字符操作时,正则表达式可以提高工作效率,在一定程度上节省你的代码。
  缺点
  当我们使用正则表达式时,复杂的正则表达式会增加代码的复杂度,使其难以理解。所以我们有时需要在正则表达式里面添加注释。
  通用模式(推荐学习:PHP编程从入门到精通)
  分隔符,通常使用“/”作为分隔符的开始和结束,也可以使用“#”。
  什么时候使用“#”?通常当你的字符串中有很多“/”字符的时候,因为这些字符是常规的时候需要转义,比如uri。
  
  使用“/”分隔符的代码如下。
  $regex = &#39;/^http:\/\/([\w.]+)\/([\w]+)\/([\w]+)\.html$/i&#39;;
$str = &#39;http://www.youku.com/show_page ... 3B%3B
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
  preg_match 中的$matches[0] 将收录匹配整个模式的字符串。
  使用“#”分隔符的代码如下。此时“/”没有转义!
  
  $regex = &#39;#^http://([\w.]+)/([\w]+)/([\w]+)\.html$#i&#39;;
$str = &#39;http://www.youku.com/show_page ... 3B%3B
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
  正则表达式的定义可以概括如下:“正则表达式描述了字符串匹配的一种模式,通过它在特定的函数中进行匹配、查找、替换、分割字符串等操作。作为一个A匹配模板是由原子、特殊功能字符和模式修饰符组成的文字模式。”
  以上是php正则表达式使用的详细内容。更多详情请关注php中文网其他相关话题文章!
  操作方法:【Web Scraper 翻页——控制链接批量抓取数据(Web Scraper
  
  Web Scraper 翻页 - 控制链接批量抓取数据(高级 Web Scraper 使用) |简单的数据分析05
  
  这是简单数据分析系列的第五部分文章。第一部分文章我们爬取了豆瓣影业TOP250的前25部电影的数据,今天我们将对原有的Web Scraper进行一些小改动,让爬虫爬取全部250部电影数据。前面我们说过,爬虫的本质是寻找规则。这些程序员在设计网页时,肯定会遵循一些规则。当我们找到规则时,我们可以预测他们的行为并实现我们的目标。今天我们就来寻找豆瓣的规则网站,想办法把所有的数据都抓起来。今天的规则从经常被忽略的 URL 链接开始。 1.链接分析我们来看看第一页的豆瓣网址链接:……

php正则函数抓取网页连接(1)如何使用正则表达式表达式

网站优化优采云 发表了文章 • 0 个评论 • 61 次浏览 • 2022-09-18 10:05 • 来自相关话题

  php正则函数抓取网页连接(1)如何使用正则表达式表达式
  
  php正则函数抓取网页连接(1)如何使用正则表达式抓取网页?php正则表达式是基于extra_prepare()函数抓取网页数据的一种表达式,网络上一般的正则表达式抓取效率比较低,并且比较耗费资源,因此一般都是使用正则表达式进行抓取数据,这些都是加以训练的,对初学者不友好,具体可以参考php正则表达式(正则表达式)学习笔记(正则表达式抓取网页)。
  
  那么,我们如何使用php正则表达式来抓取网页呢?一般我们需要写一个字符串抓取库,例如百度网页抓取库,知乎网页抓取库等等,这些库都是支持正则表达式的,具体的操作如下:/*定义一个字符串抓取库author:姓名,workyear:年月日format_code:1k=100*/libpython.middleware('example_middleware','pip_correctly',['author','workyear'])user_agent='w3c'cat_all='w3c'pat_link='w3c'pat_hash='w3c'index_name_before_word='links/example'index_name_after_word='links/user'index_all=index_name_after_wordreturnrequire('example_middleware').get('format_code','1k');//获取文件名returnrequire('format_code').get('format_format_code','1k');//获取文件内容returnrequire('format_code').get('format_format_code','1k');//对文件名进行判断pat_link='format'pat_hash='w3c'pat_link=format('format','w3c')//对文件内容进行判断pat_hash=hash('w3c')//获取文件标题pat_title=format('format','w3c')pat_title='w3c'returnpat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_title.begin()pat_title=pat_title.end()pat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlereturnpat_title例如,你是需要抓取百度的xxxabcxxx类型的数据,那么,这个时候要看返回了这些结果:headers={'accept':'*/*','accept-language':'zh-cn','accept-encoding':'gzip','connection':'keep-alive','cookie':"zh-cn16731468d623e66b。 查看全部

  php正则函数抓取网页连接(1)如何使用正则表达式表达式
  
  php正则函数抓取网页连接(1)如何使用正则表达式抓取网页?php正则表达式是基于extra_prepare()函数抓取网页数据的一种表达式,网络上一般的正则表达式抓取效率比较低,并且比较耗费资源,因此一般都是使用正则表达式进行抓取数据,这些都是加以训练的,对初学者不友好,具体可以参考php正则表达式(正则表达式)学习笔记(正则表达式抓取网页)。
  
  那么,我们如何使用php正则表达式来抓取网页呢?一般我们需要写一个字符串抓取库,例如百度网页抓取库,知乎网页抓取库等等,这些库都是支持正则表达式的,具体的操作如下:/*定义一个字符串抓取库author:姓名,workyear:年月日format_code:1k=100*/libpython.middleware('example_middleware','pip_correctly',['author','workyear'])user_agent='w3c'cat_all='w3c'pat_link='w3c'pat_hash='w3c'index_name_before_word='links/example'index_name_after_word='links/user'index_all=index_name_after_wordreturnrequire('example_middleware').get('format_code','1k');//获取文件名returnrequire('format_code').get('format_format_code','1k');//获取文件内容returnrequire('format_code').get('format_format_code','1k');//对文件名进行判断pat_link='format'pat_hash='w3c'pat_link=format('format','w3c')//对文件内容进行判断pat_hash=hash('w3c')//获取文件标题pat_title=format('format','w3c')pat_title='w3c'returnpat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_title.begin()pat_title=pat_title.end()pat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlepat_title=pat_titlereturnpat_title例如,你是需要抓取百度的xxxabcxxx类型的数据,那么,这个时候要看返回了这些结果:headers={'accept':'*/*','accept-language':'zh-cn','accept-encoding':'gzip','connection':'keep-alive','cookie':"zh-cn16731468d623e66b。

公众号登录接口返回404状态码:php正则函数抓取

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2022-09-17 04:00 • 来自相关话题

  公众号登录接口返回404状态码:php正则函数抓取
  
  php正则函数抓取网页连接:http/1。1host:namename:{authorization:'remote_method'}http/1。1host:username:。
  
  公众号id登录接口返回404状态码:404404:passwordnotfound文件上传接口返回302、303、304状态码:3--
  抓了n年的php应用程序,无论开源,还是商业,一直单纯写逻辑,简单粗暴就好,实现你的简单功能,别太复杂。把别人的框架抄来用一下,就可以了。简单的方案,抓包,抓包下面很多接口。不同接口的请求地址,调用顺序,url都不一样,网上有很多,比如springboot就是这么搞的。把静态资源复制下来,变成静态字符串,变成$_post,变成$_get,$_session,{"xxx":"xxx"}$_username,$_post,{"xxx":"xxx"}$_session都是很好的对象param。 查看全部

  公众号登录接口返回404状态码:php正则函数抓取
  
  php正则函数抓取网页连接:http/1。1host:namename:{authorization:'remote_method'}http/1。1host:username:。
  
  公众号id登录接口返回404状态码:404404:passwordnotfound文件上传接口返回302、303、304状态码:3--
  抓了n年的php应用程序,无论开源,还是商业,一直单纯写逻辑,简单粗暴就好,实现你的简单功能,别太复杂。把别人的框架抄来用一下,就可以了。简单的方案,抓包,抓包下面很多接口。不同接口的请求地址,调用顺序,url都不一样,网上有很多,比如springboot就是这么搞的。把静态资源复制下来,变成静态字符串,变成$_post,变成$_get,$_session,{"xxx":"xxx"}$_username,$_post,{"xxx":"xxx"}$_session都是很好的对象param。

php正则函数抓取网页连接为http的页面(图)

网站优化优采云 发表了文章 • 0 个评论 • 62 次浏览 • 2022-09-14 17:05 • 来自相关话题

  php正则函数抓取网页连接为http的页面(图)
  php正则函数抓取网页连接为http的页面,我们抓取的时候找到a标签,a标签的href值就是正则表达式的响应结果:req=request。urlopen(“g:/php/xxx。php?a=http&b=&c=&d=&e=&f=&g=&h=&i=&j=&k=&l=&m=&n=&o=&s=&v=&w=&xxx。
  
  cn&q=php”);xxx。php就是我们需要分析的目标页面地址,同时表示req的接收端:我们查看返回的g:/php/xxx。php文件内容php_http。html,我们发现页面结构没有什么变化,其中文件名和url都为php_http。html。其中b和c都为a标签的href值,b,c为a标签下面的子标签i,i为子标签的label标签名,和普通链接一样,子标签url和子标签i相对定位就好,而且i和url的长度没有什么区别,所以我们把页面变换一下就可以了,然后处理,我们直接使用g:/php/xxx。
  php抓取页面内容,本地本地查看,g:/php/xxx。php是否执行正确,不正确的话,查看ip地址:g:/php/xxx。php因为正则一般都是显示前面的字符,所以我们把这个问题传给这个http请求d:/php/xxx。php传递参数ex原则上我们抓取页面到某个ex后我们可以不管这个http请求g:/php/xxx。
  
  php是否执行我们就用httpget去下载内容,那么,问题又来了,爬虫其实是调用了正则来读取某个结构或者网页数据,但是我们想自己抓取http的html源码,还要转换为list,我们怎么办呢?其实我们可以用正则表达式来解决,但是很多时候很长的正则可能要处理很久,这里我们可以手动写代码进行转换,也可以借助一些工具转换,手动写代码:我们还是从捕获链接开始抓取:;e。
  gp=/http/hello-world/:920-l01-0753-afd7-e71b84a9433d0/-hub-%e5%8e%a3%e6%a3%a9%e4%be%98%e5%93%80%e8%b5%b4%e8%bd%af%e5%88%90%e5%92%89%e7%94%9f%e7%9b%bd/g:/php/xxx。
  php看看能否抓取下来,看一下时间和urlurl为:;e。gp=/http/hello-world/:920-l01-0753-afd7-e71b84a9433d0/-hub-%e5%8e%a3%e6%a3%a9%e4%be%98%e5%93%80%e8%b5%b4%e8%bd%af%e5%88%90%e5%92%89%e7%94%9f%e7%9b%bd/g:/php/xxx。php其中的/http/hello-world/:92。 查看全部

  php正则函数抓取网页连接为http的页面(图)
  php正则函数抓取网页连接为http的页面,我们抓取的时候找到a标签,a标签的href值就是正则表达式的响应结果:req=request。urlopen(“g:/php/xxx。php?a=http&b=&c=&d=&e=&f=&g=&h=&i=&j=&k=&l=&m=&n=&o=&s=&v=&w=&xxx。
  
  cn&q=php”);xxx。php就是我们需要分析的目标页面地址,同时表示req的接收端:我们查看返回的g:/php/xxx。php文件内容php_http。html,我们发现页面结构没有什么变化,其中文件名和url都为php_http。html。其中b和c都为a标签的href值,b,c为a标签下面的子标签i,i为子标签的label标签名,和普通链接一样,子标签url和子标签i相对定位就好,而且i和url的长度没有什么区别,所以我们把页面变换一下就可以了,然后处理,我们直接使用g:/php/xxx。
  php抓取页面内容,本地本地查看,g:/php/xxx。php是否执行正确,不正确的话,查看ip地址:g:/php/xxx。php因为正则一般都是显示前面的字符,所以我们把这个问题传给这个http请求d:/php/xxx。php传递参数ex原则上我们抓取页面到某个ex后我们可以不管这个http请求g:/php/xxx。
  
  php是否执行我们就用httpget去下载内容,那么,问题又来了,爬虫其实是调用了正则来读取某个结构或者网页数据,但是我们想自己抓取http的html源码,还要转换为list,我们怎么办呢?其实我们可以用正则表达式来解决,但是很多时候很长的正则可能要处理很久,这里我们可以手动写代码进行转换,也可以借助一些工具转换,手动写代码:我们还是从捕获链接开始抓取:;e。
  gp=/http/hello-world/:920-l01-0753-afd7-e71b84a9433d0/-hub-%e5%8e%a3%e6%a3%a9%e4%be%98%e5%93%80%e8%b5%b4%e8%bd%af%e5%88%90%e5%92%89%e7%94%9f%e7%9b%bd/g:/php/xxx。
  php看看能否抓取下来,看一下时间和urlurl为:;e。gp=/http/hello-world/:920-l01-0753-afd7-e71b84a9433d0/-hub-%e5%8e%a3%e6%a3%a9%e4%be%98%e5%93%80%e8%b5%b4%e8%bd%af%e5%88%90%e5%92%89%e7%94%9f%e7%9b%bd/g:/php/xxx。php其中的/http/hello-world/:92。

php正则用:反爬虫用selenium建议去买个小米路由器

网站优化优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-07-26 14:02 • 来自相关话题

  php正则用:反爬虫用selenium建议去买个小米路由器
  php正则函数抓取网页连接。抓取首页有时会抓到密码框的数据。还有一种常见的方法是抓取php反向工程的文件,从而抓取整个页面。学会抓取网页上没有的东西,比如隐藏的功能,等等。
  创建爬虫用:反爬虫用selenium
  建议去买个小米路由器1体验一下。
  补充楼上一个selenium,
  
  网络请求,建议先用requests或urllib.request获取url中的xpath。能用浏览器访问则更好,不然你发现你爬某站失败了,因为你不知道url和xpath中是否包含了该站的关键词。
  创建爬虫用:反爬虫用selenium用:
  多爬几站找几个标签网站做爬虫1,多爬几站找几个标签网站做爬虫2,
  php的话,建议使用google的selenium抓包,用原生js可以实现动态页面的抓取,
  我写过爬虫脚本,python没用过。最直接的是利用beautifulsoup解析网页中的xpath。
  
  当然是selenium咯
  推荐selenium,
  花了一个小时了解了一下爬虫的一些基本技巧。1.什么是爬虫:就是一些能够模拟浏览器行为从url(路径)中解析出“html”,然后返回给浏览器的程序。2.简单了解了一下selenium框架的构造和整合,使用了python2.7和python3。了解到python语言中的extension必须在一个python源文件的头文件中添加@extension的代码注解。
  3.整个爬虫的github地址:spiderspider-spiderhubv2.1.1是python2.7。4.代码分享地址:,我是通过python的python-common库的python/selenium框架搞定的,selenium第二个模块dom(dom)加载和python原生的html(htmlform)操作比起来,要复杂一些。
<p>python-common只需要在导入前加上两行python的注解:-shared_class(isabstract)+-shared_class(isabstract)5.方法分享:其实上面的方法都是多余的,因为我没有实际使用,如果你只是会造轮子,那么直接在selenium中直接操作浏览器的时候插入如下的代码#define_directory(task)#以后就不能手动输入host了#通过python的python-common代码注解如下:classspiderspider:defstart(self):self.task=taskdefdisplay(self):if(self.task==task):#如果self.task==task代码结束#重写super().start()print'helloworld'withopen('test.html','a')asf:f.write("我要执行'我要执行'我要执行'我要执行' 查看全部

  php正则用:反爬虫用selenium建议去买个小米路由器
  php正则函数抓取网页连接。抓取首页有时会抓到密码框的数据。还有一种常见的方法是抓取php反向工程的文件,从而抓取整个页面。学会抓取网页上没有的东西,比如隐藏的功能,等等。
  创建爬虫用:反爬虫用selenium
  建议去买个小米路由器1体验一下。
  补充楼上一个selenium,
  
  网络请求,建议先用requests或urllib.request获取url中的xpath。能用浏览器访问则更好,不然你发现你爬某站失败了,因为你不知道url和xpath中是否包含了该站的关键词
  创建爬虫用:反爬虫用selenium用:
  多爬几站找几个标签网站做爬虫1,多爬几站找几个标签网站做爬虫2,
  php的话,建议使用google的selenium抓包,用原生js可以实现动态页面的抓取,
  我写过爬虫脚本,python没用过。最直接的是利用beautifulsoup解析网页中的xpath。
  
  当然是selenium咯
  推荐selenium,
  花了一个小时了解了一下爬虫的一些基本技巧。1.什么是爬虫:就是一些能够模拟浏览器行为从url(路径)中解析出“html”,然后返回给浏览器的程序。2.简单了解了一下selenium框架的构造和整合,使用了python2.7和python3。了解到python语言中的extension必须在一个python源文件的头文件中添加@extension的代码注解。
  3.整个爬虫的github地址:spiderspider-spiderhubv2.1.1是python2.7。4.代码分享地址:,我是通过python的python-common库的python/selenium框架搞定的,selenium第二个模块dom(dom)加载和python原生的html(htmlform)操作比起来,要复杂一些。
<p>python-common只需要在导入前加上两行python的注解:-shared_class(isabstract)+-shared_class(isabstract)5.方法分享:其实上面的方法都是多余的,因为我没有实际使用,如果你只是会造轮子,那么直接在selenium中直接操作浏览器的时候插入如下的代码#define_directory(task)#以后就不能手动输入host了#通过python的python-common代码注解如下:classspiderspider:defstart(self):self.task=taskdefdisplay(self):if(self.task==task):#如果self.task==task代码结束#重写super().start()print'helloworld'withopen('test.html','a')asf:f.write("我要执行'我要执行'我要执行'我要执行'

php正则函数抓取网页连接,举个例子(一)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2022-07-04 19:02 • 来自相关话题

  php正则函数抓取网页连接,举个例子(一)
  php正则函数抓取网页连接,举个例子如下:method('location(\w\w)(\w\w)');post。open("",method('location(\w\w)(\w\w)'));执行该代码后访问:8080/www/*/可以看到存在包含:www/*/,rest回来解析:method('location(\w\w)(\w\w)');post。
  
  open("",method('location(\w\w)(\w\w)'));rest的数据类型为:http请求(个人猜测应该是get)url地址rest的数据类型为:http请求(个人猜测应该是get)rest对象http请求对象:request_body请求头部:host(host)user-agent(浏览器的隐藏部分)port(port)cookie(cookie)body(请求内容)(header)policy(policy)http返回结果post返回结果:accept/x-www-form-urlencoded//(请求类型选择列表,user-agent,port);通过http请求向www服务器传递一个必要参数,该参数是客户端可以通过http函数获取服务器实际返回的内容:content-type:(如果非空,则为application/x-www-form-urlencoded请求头:是否返回响应体响应体:是否需要参数params:(用于http请求参数)//(请求头参数),返回有header和rest对象的信息完整代码:__attribute__:publicfinalstringhttp(stringurl,stringrequest,stringresponse){stringlanguage=stringutils。
  newbyline(url。header);stringname=stringutils。newbyline(request。getheader("x-http-x-name"));stringuser=language+"request"+request。getheader("user-agent");if(name=="www"){stringscheme=stringutils。
  
  newbyline(request。getheader("scheme"));if(user=="*"){stringtimestamp=newdate();if(timestamp。value。tolowercase()。tolowercase()){timestamp。value=timestamp。
  long();}}}http(language,user,scheme);returnname;}//xmlhttprequestrequest请求过程详解:http(host,user,scheme):表示请求url,即你的服务器所在机房里的机器。(如果是其他机器则。 查看全部

  php正则函数抓取网页连接,举个例子(一)
  php正则函数抓取网页连接,举个例子如下:method('location(\w\w)(\w\w)');post。open("",method('location(\w\w)(\w\w)'));执行该代码后访问:8080/www/*/可以看到存在包含:www/*/,rest回来解析:method('location(\w\w)(\w\w)');post。
  
  open("",method('location(\w\w)(\w\w)'));rest的数据类型为:http请求(个人猜测应该是get)url地址rest的数据类型为:http请求(个人猜测应该是get)rest对象http请求对象:request_body请求头部:host(host)user-agent(浏览器的隐藏部分)port(port)cookie(cookie)body(请求内容)(header)policy(policy)http返回结果post返回结果:accept/x-www-form-urlencoded//(请求类型选择列表,user-agent,port);通过http请求向www服务器传递一个必要参数,该参数是客户端可以通过http函数获取服务器实际返回的内容:content-type:(如果非空,则为application/x-www-form-urlencoded请求头:是否返回响应体响应体:是否需要参数params:(用于http请求参数)//(请求头参数),返回有header和rest对象的信息完整代码:__attribute__:publicfinalstringhttp(stringurl,stringrequest,stringresponse){stringlanguage=stringutils。
  newbyline(url。header);stringname=stringutils。newbyline(request。getheader("x-http-x-name"));stringuser=language+"request"+request。getheader("user-agent");if(name=="www"){stringscheme=stringutils。
  
  newbyline(request。getheader("scheme"));if(user=="*"){stringtimestamp=newdate();if(timestamp。value。tolowercase()。tolowercase()){timestamp。value=timestamp。
  long();}}}http(language,user,scheme);returnname;}//xmlhttprequestrequest请求过程详解:http(host,user,scheme):表示请求url,即你的服务器所在机房里的机器。(如果是其他机器则。

网易云音乐热门作品名字和链接抓取(正则表达式篇)

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2022-06-27 12:23 • 来自相关话题

  网易云音乐热门作品名字和链接抓取(正则表达式篇)
  点击上方“Python共享之家”,进行关注
  回复“资源”即可获赠Python学习资料
  今
  日
  鸡
  汤
  问姓惊初见,称名忆旧容。
  
  大家好,我是皮皮。
  一、前言
  前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。
  二、实现过程
  究其原因是返回的响应里边并不是规整的html格式,所以直接使用xpath是拿不到的。这里【Python进阶者】给了一个使用正则表达式的方法来实现的代码,代码如下。
<p># coding:utf-8<br /><br /># @Time : 2022/5/9 23:46<br /># @Author: 皮皮<br /># @公众号: Python共享之家<br /># @website : http://pdcfighting.com/<br /># @File : 网易云音乐热门作品名字和链接(正则表达式).py<br /># @Software: PyCharm<br /><br />#<br />#                             _ooOoo_<br />#                            o8888888o<br />#                            88" . "88<br />#                            (| -_- |)<br />#                            O\  =  /O<br />#                         ____/`---'\____<br />#                       .'  \\|     |//  `.<br />#                      /  \\|||  :  |||//  \<br />#                     /  _||||| -:- |||||-  \<br />#                     |   | \\\  -  /// |   |<br />#                     | \_|  ''\---/''  |   |<br />#                     \  .-\__  `-`  ___/-. /<br />#                   ___`. .'  /--.--\  `. . __<br />#                ."" ' 查看全部

  网易云音乐热门作品名字和链接抓取(正则表达式篇)
  点击上方“Python共享之家”,进行关注
  回复“资源”即可获赠Python学习资料
  今
  日
  鸡
  汤
  问姓惊初见,称名忆旧容。
  
  大家好,我是皮皮。
  一、前言
  前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。
  二、实现过程
  究其原因是返回的响应里边并不是规整的html格式,所以直接使用xpath是拿不到的。这里【Python进阶者】给了一个使用正则表达式的方法来实现的代码,代码如下。
<p># coding:utf-8<br /><br /># @Time : 2022/5/9 23:46<br /># @Author: 皮皮<br /># @公众号: Python共享之家<br /># @website : http://pdcfighting.com/<br /># @File : 网易云音乐热门作品名字和链接(正则表达式).py<br /># @Software: PyCharm<br /><br />#<br />#                             _ooOoo_<br />#                            o8888888o<br />#                            88" . "88<br />#                            (| -_- |)<br />#                            O\  =  /O<br />#                         ____/`---'\____<br />#                       .'  \\|     |//  `.<br />#                      /  \\|||  :  |||//  \<br />#                     /  _||||| -:- |||||-  \<br />#                     |   | \\\  -  /// |   |<br />#                     | \_|  ''\---/''  |   |<br />#                     \  .-\__  `-`  ___/-. /<br />#                   ___`. .'  /--.--\  `. . __<br />#                ."" '

php正则函数抓取网页连接和提取内容都可以用mt+

网站优化优采云 发表了文章 • 0 个评论 • 214 次浏览 • 2022-06-24 06:02 • 来自相关话题

  php正则函数抓取网页连接和提取内容都可以用mt+
  php正则函数抓取网页连接和提取内容都可以用mt+re,
  1.可以使用正则表达式或者模糊匹配把网址从整个页面提取出来。
  正则表达式,譬如匹配这类特殊字符,
  正则表达式
  可以在提取url的基础上用正则表达式来定位要提取的字符串。比如,你要提取“赵”这个字,
  2)”将整个url“(美元的$1,$
  2)”中“$1”替换成被替换的单词,
  2)”提取出“赵”这个字。
  我的一般工作就是爬虫,也用python进行爬虫,碰到知乎的这个提问感觉很惊讶,学了python如何提取网页中的文字呢?从字面理解可以提取关键词、url等信息,但是有没有想过爬虫自己还会存在连接网页文字的情况呢?在python中可以借助正则表达式,那我们不就又有可能获取网页中的所有文字信息,那可以思考一下下图1是源代码地址,2是我们要爬取的链接地址,我们希望网页中的文字也能提取出来。
  图1图2我们可以发现图1中所有的表头都存放在一个叫id类型中,方便我们进行后续的分析和匹配等等;下图3中entitys都存放在info这个类型中;这些类型都是正则表达式特定字符,方便我们定位到真正需要的关键词或者文字。如果要找关键词,就写python代码过滤,如果找到文字就放入列表;在python中还可以利用正则表达式,快速从网页文字中提取文字,但是这样可能效率太低了;还可以使用第三方工具,譬如说爬虫常用的selenium,这类软件常常会用到正则表达式,有时候正则表达式比直接在网页上爬取关键词是更快更方便的。
  但是要用代码写的话真的很麻烦,我是说常常的麻烦,网上基本上找不到可以用python编写正则表达式的库;此外有可能我根本就用不上这么复杂的正则表达式。网上没有,那我还不如直接爬网页文字,爬哪网页文字我就存哪里,方便我比较完全吧。而且你要把正则表达式写得不见文字的话是不是又有点浪费时间。知乎也有过这样的提问,其实把正则表达式写在方法里是个不错的方式,但是我觉得那样没有写正则表达式直接在网页中爬取效率高啊,我的经验是网页文字可以不一定有那么多。方法有了,我觉得知乎也就有点玄学的感觉了。 查看全部

  php正则函数抓取网页连接和提取内容都可以用mt+
  php正则函数抓取网页连接和提取内容都可以用mt+re,
  1.可以使用正则表达式或者模糊匹配把网址从整个页面提取出来。
  正则表达式,譬如匹配这类特殊字符,
  正则表达式
  可以在提取url的基础上用正则表达式来定位要提取的字符串。比如,你要提取“赵”这个字,
  2)”将整个url“(美元的$1,$
  2)”中“$1”替换成被替换的单词,
  2)”提取出“赵”这个字。
  我的一般工作就是爬虫,也用python进行爬虫,碰到知乎的这个提问感觉很惊讶,学了python如何提取网页中的文字呢?从字面理解可以提取关键词、url等信息,但是有没有想过爬虫自己还会存在连接网页文字的情况呢?在python中可以借助正则表达式,那我们不就又有可能获取网页中的所有文字信息,那可以思考一下下图1是源代码地址,2是我们要爬取的链接地址,我们希望网页中的文字也能提取出来。
  图1图2我们可以发现图1中所有的表头都存放在一个叫id类型中,方便我们进行后续的分析和匹配等等;下图3中entitys都存放在info这个类型中;这些类型都是正则表达式特定字符,方便我们定位到真正需要的关键词或者文字。如果要找关键词,就写python代码过滤,如果找到文字就放入列表;在python中还可以利用正则表达式,快速从网页文字中提取文字,但是这样可能效率太低了;还可以使用第三方工具,譬如说爬虫常用的selenium,这类软件常常会用到正则表达式,有时候正则表达式比直接在网页上爬取关键词是更快更方便的。
  但是要用代码写的话真的很麻烦,我是说常常的麻烦,网上基本上找不到可以用python编写正则表达式的库;此外有可能我根本就用不上这么复杂的正则表达式。网上没有,那我还不如直接爬网页文字,爬哪网页文字我就存哪里,方便我比较完全吧。而且你要把正则表达式写得不见文字的话是不是又有点浪费时间。知乎也有过这样的提问,其实把正则表达式写在方法里是个不错的方式,但是我觉得那样没有写正则表达式直接在网页中爬取效率高啊,我的经验是网页文字可以不一定有那么多。方法有了,我觉得知乎也就有点玄学的感觉了。

php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS

网站优化优采云 发表了文章 • 0 个评论 • 57 次浏览 • 2022-06-13 19:53 • 来自相关话题

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS 查看全部

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(

  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS

php正则函数抓取网页连接,但是需要注意哪些问题?

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-06-13 02:02 • 来自相关话题

  php正则函数抓取网页连接,但是需要注意哪些问题?
  php正则函数抓取网页连接,但是如果这个网页比较大,抓取速度会变慢。如果把一些大连接字符串映射为一些小连接字符串,会极大减少抓取时间。对于一些小网站,只需要把网页内容中的固定字符转换成一些固定长度的字符串,然后用正则表达式进行匹配,如果字符串长度等于或等于原字符串长度,匹配失败,字符串长度小于原字符串长度,匹配成功。转换的过程中去掉了空格、特殊字符等字符,数据量控制在可接受范围内。
  可以把多条字符串,一对一的拼接成一条新的连接字符串。
  replace()可以匹配一对一的,或者用一个正则表达式写连接函数或者手工匹配。直接用正则表达式匹配已经有连接结果数据库查询,
  简单举个例子,字符串里写一个{1,2,3},匹配的过程在字符串里添加一个1和2的组合,把1粘合在字符串的1后面,把2粘合在字符串的2后面。匹配需要匹配多次,所以要看匹配到的字符串的长度是否小于1。匹配的次数为1次匹配不通过,匹配次数为100次,匹配的结果就会被replace掉,完成词组匹配。匹配的词组越长,replace的次数就会越多。
  可以一般字符串匹配用正则表达式,列表匹配用正则表达式,
  匹配字符串有5种方法:
  1、自动匹配
  2、搜索匹配
  3、正则匹配
  4、替换匹配
  5、正则+字符串匹配 查看全部

  php正则函数抓取网页连接,但是需要注意哪些问题?
  php正则函数抓取网页连接,但是如果这个网页比较大,抓取速度会变慢。如果把一些大连接字符串映射为一些小连接字符串,会极大减少抓取时间。对于一些小网站,只需要把网页内容中的固定字符转换成一些固定长度的字符串,然后用正则表达式进行匹配,如果字符串长度等于或等于原字符串长度,匹配失败,字符串长度小于原字符串长度,匹配成功。转换的过程中去掉了空格、特殊字符等字符,数据量控制在可接受范围内。
  可以把多条字符串,一对一的拼接成一条新的连接字符串。
  replace()可以匹配一对一的,或者用一个正则表达式写连接函数或者手工匹配。直接用正则表达式匹配已经有连接结果数据库查询,
  简单举个例子,字符串里写一个{1,2,3},匹配的过程在字符串里添加一个1和2的组合,把1粘合在字符串的1后面,把2粘合在字符串的2后面。匹配需要匹配多次,所以要看匹配到的字符串的长度是否小于1。匹配的次数为1次匹配不通过,匹配次数为100次,匹配的结果就会被replace掉,完成词组匹配。匹配的词组越长,replace的次数就会越多。
  可以一般字符串匹配用正则表达式,列表匹配用正则表达式,
  匹配字符串有5种方法:
  1、自动匹配
  2、搜索匹配
  3、正则匹配
  4、替换匹配
  5、正则+字符串匹配

php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS

网站优化优采云 发表了文章 • 0 个评论 • 75 次浏览 • 2022-06-03 08:41 • 来自相关话题

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS 查看全部

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS

php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2022-06-02 01:38 • 来自相关话题

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS 查看全部

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS

网易云音乐热门作品名字和链接抓取(html5lib篇)

网站优化优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2022-06-01 13:20 • 来自相关话题

  网易云音乐热门作品名字和链接抓取(html5lib篇)
  点击上方“Python共享之家”,进行关注
  回复“资源”即可获赠Python学习资料
  今
  日
  鸡
  汤
  落叶人何在,寒云路几层。
  大家好,我是皮皮。
  一、前言
  前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。
  
  之前的文章,已经使用了正则表达式和xpath、bs4和pyquery四个方法进行了相关实现,,,,,这篇文章我们使用html5lib来实现。
  二、实现过程
  这里【甯同学】给了一个使用html5lib方法来实现的代码,简单来说就是用html5lib修复html就可以了,代码如下。 <p># coding:utf-8<br /><br /># @Time : 2022/5/10 10:46<br /># @Author: 皮皮<br /># @公众号: Python共享之家<br /># @website : http://pdcfighting.com/<br /># @File : 网易云音乐热门作品名字和链接(html5lib).py<br /># @Software: PyCharm<br /><br />#<br />#                             _ooOoo_<br />#                            o8888888o<br />#                            88" . "88<br />#                            (| -_- |)<br />#                            O\  =  /O<br />#                         ____/`---'\____<br />#                       .'  \\|     |//  `.<br />#                      /  \\|||  :  |||//  \<br />#                     /  _||||| -:- |||||-  \<br />#                     |   | \\\  -  /// |   |<br />#                     | \_|  ''\---/''  |   |<br />#                     \  .-\__  `-`  ___/-. /<br />#                   ___`. .'  /--.--\  `. . __<br />#                ."" ' 查看全部

  网易云音乐热门作品名字和链接抓取(html5lib篇)
  点击上方“Python共享之家”,进行关注
  回复“资源”即可获赠Python学习资料
  今
  日
  鸡
  汤
  落叶人何在,寒云路几层。
  大家好,我是皮皮。
  一、前言
  前几天在Python白银交流群有个叫【O|】的粉丝问了一道关于网易云音乐热门作品名字和链接抓取的问题,获取源码之后,发现使用xpath匹配拿不到东西,从响应来看,确实是可以看得到源码的。
  
  之前的文章,已经使用了正则表达式和xpath、bs4和pyquery四个方法进行了相关实现,,,,,这篇文章我们使用html5lib来实现。
  二、实现过程
  这里【甯同学】给了一个使用html5lib方法来实现的代码,简单来说就是用html5lib修复html就可以了,代码如下。 <p># coding:utf-8<br /><br /># @Time : 2022/5/10 10:46<br /># @Author: 皮皮<br /># @公众号: Python共享之家<br /># @website : http://pdcfighting.com/<br /># @File : 网易云音乐热门作品名字和链接(html5lib).py<br /># @Software: PyCharm<br /><br />#<br />#                             _ooOoo_<br />#                            o8888888o<br />#                            88" . "88<br />#                            (| -_- |)<br />#                            O\  =  /O<br />#                         ____/`---'\____<br />#                       .'  \\|     |//  `.<br />#                      /  \\|||  :  |||//  \<br />#                     /  _||||| -:- |||||-  \<br />#                     |   | \\\  -  /// |   |<br />#                     | \_|  ''\---/''  |   |<br />#                     \  .-\__  `-`  ___/-. /<br />#                   ___`. .'  /--.--\  `. . __<br />#                ."" '

OCR入门(附数据集链接)

网站优化优采云 发表了文章 • 0 个评论 • 299 次浏览 • 2022-05-15 01:36 • 来自相关话题

  OCR入门(附数据集链接)
  
  近日,“大学生用OCR+正则表达式快速核查学生核酸报告”的新闻火了,细心观察我们就能发现,生活里OCR的身影到处都是:文档扫描、车牌识别、证件识别等等。在这个信息技术高速发展的时代,越来越多的小事可以“智能化”、“信息化”,曾经需要浪费诸多人力物力才能完成的事,可以通过新的技术轻松地解决。
  
  01
  OCR是解决什么问题的技术
  
  文章开头提到的新闻里,OCR技术到底解决了什么问题?上图是一张上海市健康云截图,复旦大学博士生使用OCR技术监测到文本,再提取其中的文字信息,每次核查数百人的截图仅需几分钟。抽象的字符让人感觉技术深不可测,但是等读者们稍作了解之后,会发现高科技是非常亲切实用的。OCR中文名叫做“光学字符识别”,它可以将名片、票据、身份证、驾照等文档资料中的文字和数字信息转换成文本信息,以电子形式保存,实现信息采集的快速录入。现在有非常多实现OCR功能的免费接口,传入图片路径,就可以调用接口函数,识别图片中的文字信息。
  02
  OCR的常见流程
  
  常见OCR方法的具体过程通常分为以下四个步骤:
  预处理:是对图像进行初步的处理,目的是减少图像中的无用信息,方便提取特征。常用的步骤有:灰度化、降噪、二值化、字符切分、归一化等。特征提取和降维:是识别文字、数字的关键步骤之一。特征是识别文字的关键信息,每个不同的文字通过特征来和其他文字进行区分。数字和英文字符相对中文字符来说更容易区分。为了提高后续分类器的效果和效率,往往还要进行降维,进一步减少特征中的无用信息,同时把有用信息尽可能多地保留下来。分类器设计:对特征进行识别,是进行文字、数字识别的关键步骤之一。在这一步中,分类器对特征进行分类,将其识别成对应的字符。分类器一般需要提前训练,常见的分类器有:支持向量机、神经网络等。后处理:是对分类结果进行优化处理的步骤。经过分类器分类得到的结果是不完全准确的,比如对形近字的识别错误率比较高、识别结果存在排版错误,后处理就可以有针对性地解决这些问题。例如,通过语言模型校正将“存哪里”校正为“在哪里”,并对识别结果进行格式化。
  03
  正则表达式是什么
  
  正则表达式在人物场景中承担的是什么责任呢?经过前面叙述的流程,从图片中提取出来的文字信息,需要进一步整理提取,实现自动化核查。正则表达式通常被用来检索、替换符合特定模式的文本。正则表达式可以提取出文本中的特定文本,即:姓名、证件号码、采样时间、检测结果等,再输出到Excel中。
  04
  OCR数据集
  
  目前主流的OCR任务会使用深度学习方法,这意味着数据集是其中的关键。
  文本检测数据集SynthText:~vgg/data/scenetext/ICDAR是竞赛数据集,2003年、2013年、2015年、2017年分别开放了以下数据集:谷歌图像中收集整理得到的IIIT 5K words数据集:还有一些公开数据集,如:SVT、CUTE等。Github上有一个OCR数据汇总可以查看:大多数OCR数据集包含的图像数量比较少,并不足以训练出一个模型,需要合成新的数据集使用。
  05
  小结
  
  OCR技术不算是最新的技术,早在十年前它就火过,随着近年深度学习的迅速发展,基于深度学习的OCR技术也逐渐成熟,能够更好更灵活地应对不同场景,已经成为科技公司的能力标配。
  进技术交流群请添加AINLP小助手微信(id: ainlper)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />请备注具体方向+所用到的相关技术点<p style="margin-top: 15px;margin-bottom: 15px;outline: 0px;max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;widows: 1;caret-color: rgb(51, 51, 51);white-space: pre-line;line-height: 30px;color: rgb(74, 74, 74);font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif;overflow-wrap: break-word !important;">关于AINLP
  AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
  <br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
  
  阅读至此了,分享、点赞、在看三选一吧</p> 查看全部

  OCR入门(附数据集链接)
  
  近日,“大学生用OCR+正则表达式快速核查学生核酸报告”的新闻火了,细心观察我们就能发现,生活里OCR的身影到处都是:文档扫描、车牌识别、证件识别等等。在这个信息技术高速发展的时代,越来越多的小事可以“智能化”、“信息化”,曾经需要浪费诸多人力物力才能完成的事,可以通过新的技术轻松地解决。
  
  01
  OCR是解决什么问题的技术
  
  文章开头提到的新闻里,OCR技术到底解决了什么问题?上图是一张上海市健康云截图,复旦大学博士生使用OCR技术监测到文本,再提取其中的文字信息,每次核查数百人的截图仅需几分钟。抽象的字符让人感觉技术深不可测,但是等读者们稍作了解之后,会发现高科技是非常亲切实用的。OCR中文名叫做“光学字符识别”,它可以将名片、票据、身份证、驾照等文档资料中的文字和数字信息转换成文本信息,以电子形式保存,实现信息采集的快速录入。现在有非常多实现OCR功能的免费接口,传入图片路径,就可以调用接口函数,识别图片中的文字信息。
  02
  OCR的常见流程
  
  常见OCR方法的具体过程通常分为以下四个步骤:
  预处理:是对图像进行初步的处理,目的是减少图像中的无用信息,方便提取特征。常用的步骤有:灰度化、降噪、二值化、字符切分、归一化等。特征提取和降维:是识别文字、数字的关键步骤之一。特征是识别文字的关键信息,每个不同的文字通过特征来和其他文字进行区分。数字和英文字符相对中文字符来说更容易区分。为了提高后续分类器的效果和效率,往往还要进行降维,进一步减少特征中的无用信息,同时把有用信息尽可能多地保留下来。分类器设计:对特征进行识别,是进行文字、数字识别的关键步骤之一。在这一步中,分类器对特征进行分类,将其识别成对应的字符。分类器一般需要提前训练,常见的分类器有:支持向量机、神经网络等。后处理:是对分类结果进行优化处理的步骤。经过分类器分类得到的结果是不完全准确的,比如对形近字的识别错误率比较高、识别结果存在排版错误,后处理就可以有针对性地解决这些问题。例如,通过语言模型校正将“存哪里”校正为“在哪里”,并对识别结果进行格式化。
  03
  正则表达式是什么
  
  正则表达式在人物场景中承担的是什么责任呢?经过前面叙述的流程,从图片中提取出来的文字信息,需要进一步整理提取,实现自动化核查。正则表达式通常被用来检索、替换符合特定模式的文本。正则表达式可以提取出文本中的特定文本,即:姓名、证件号码、采样时间、检测结果等,再输出到Excel中。
  04
  OCR数据集
  
  目前主流的OCR任务会使用深度学习方法,这意味着数据集是其中的关键。
  文本检测数据集SynthText:~vgg/data/scenetext/ICDAR是竞赛数据集,2003年、2013年、2015年、2017年分别开放了以下数据集:谷歌图像中收集整理得到的IIIT 5K words数据集:还有一些公开数据集,如:SVT、CUTE等。Github上有一个OCR数据汇总可以查看:大多数OCR数据集包含的图像数量比较少,并不足以训练出一个模型,需要合成新的数据集使用。
  05
  小结
  
  OCR技术不算是最新的技术,早在十年前它就火过,随着近年深度学习的迅速发展,基于深度学习的OCR技术也逐渐成熟,能够更好更灵活地应对不同场景,已经成为科技公司的能力标配。
  进技术交流群请添加AINLP小助手微信(id: ainlper)<br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />请备注具体方向+所用到的相关技术点<p style="margin-top: 15px;margin-bottom: 15px;outline: 0px;max-width: 100%;box-sizing: border-box;letter-spacing: 0.544px;widows: 1;caret-color: rgb(51, 51, 51);white-space: pre-line;line-height: 30px;color: rgb(74, 74, 74);font-family: Avenir, -apple-system-font, 微软雅黑, sans-serif;overflow-wrap: break-word !important;">关于AINLP
  AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
  <br style="outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />
  
  阅读至此了,分享、点赞、在看三选一吧</p>

正则代理001-正则表达式的介绍、详细用法和注意事项

网站优化优采云 发表了文章 • 0 个评论 • 106 次浏览 • 2022-05-14 19:01 • 来自相关话题

  正则代理001-正则表达式的介绍、详细用法和注意事项
  php正则函数抓取网页连接:正则代理001-正则表达式的介绍、详细用法和注意事项。正则表达式的介绍002-正则表达式的详细用法和注意事项。
  正则表达式总结下来说,是对匹配的文本字符串中的某些字符进行匹配,找到与这些字符相匹配的字符串的过程。其实正则表达式很简单,就是找一些数字/字母/特殊字符等等一些字符组成的字符串匹配规则,然后进行匹配即可。无非就是先分好类,找到要匹配的文本字符,然后匹配就完事儿了。常用的常用的正则表达式有re.search(发现目标字符串),re.exec(找到文本字符串中对应字符的过程),re.siblings(匹配一对一匹配的关系),re.sub(匹配一对多的关系),match(查找给定匹配中的一个字符串)等等。
  这些都是很常用的,尤其是最后的查找给定匹配中的一个字符串。(正则表达式给定匹配中的一个字符串)基本上我们常用的正则表达式都有一些固定的模式,这些固定的模式也就是正则表达式本身的长度参数,这个也很好理解,比如'aaaa',那是匹配a的那一个,自然这里就匹配aa这个字符串。然后把aa,g这些模式串成一个整体,也就是这一长串字符串,那么就是一个a类似整数的集合,如果把'aaaa'映射一个整数集合,就是a,-1,1,2,2,-4,4等等,自然结果就会是0到200000000了。
  也就是常用正则匹配的字符串长度参数的个数。然后如果有一些正则字符,还有个别的一些特殊字符或者汉字,这里有个构成的模式的个数,这个也就是正则表达式的参数个数,比如re.s,re.replace,re.table,bin等等。本质上来说,模式就是各种匹配到特定结果的匹配规则。(正则表达式匹配规则的个数)总之我们对正则表达式就是各种参数,以及各种参数组合串成的整体。
  匹配规则个数会有所不同,也就是正则表达式的长度参数个数会不同。常用的匹配规则还有aa,ff,gj这些特殊,a,g,j,r,e这些常用字符。其实也可以等价与c语言常用的ao,eo等等正则表达式语法。手机码字,格式见谅。上面其实就是最常用的正则表达式,至于函数,那更多了,只列一点比较常用的比较常用的。3w1r,hire,pipeline,find(find同width),find(find同finger),join(join同concat),replace(replace同concat),text(text同concat),text(text同join),white(white同concat),book(white同c。 查看全部

  正则代理001-正则表达式的介绍、详细用法和注意事项
  php正则函数抓取网页连接:正则代理001-正则表达式的介绍、详细用法和注意事项。正则表达式的介绍002-正则表达式的详细用法和注意事项。
  正则表达式总结下来说,是对匹配的文本字符串中的某些字符进行匹配,找到与这些字符相匹配的字符串的过程。其实正则表达式很简单,就是找一些数字/字母/特殊字符等等一些字符组成的字符串匹配规则,然后进行匹配即可。无非就是先分好类,找到要匹配的文本字符,然后匹配就完事儿了。常用的常用的正则表达式有re.search(发现目标字符串),re.exec(找到文本字符串中对应字符的过程),re.siblings(匹配一对一匹配的关系),re.sub(匹配一对多的关系),match(查找给定匹配中的一个字符串)等等。
  这些都是很常用的,尤其是最后的查找给定匹配中的一个字符串。(正则表达式给定匹配中的一个字符串)基本上我们常用的正则表达式都有一些固定的模式,这些固定的模式也就是正则表达式本身的长度参数,这个也很好理解,比如'aaaa',那是匹配a的那一个,自然这里就匹配aa这个字符串。然后把aa,g这些模式串成一个整体,也就是这一长串字符串,那么就是一个a类似整数的集合,如果把'aaaa'映射一个整数集合,就是a,-1,1,2,2,-4,4等等,自然结果就会是0到200000000了。
  也就是常用正则匹配的字符串长度参数的个数。然后如果有一些正则字符,还有个别的一些特殊字符或者汉字,这里有个构成的模式的个数,这个也就是正则表达式的参数个数,比如re.s,re.replace,re.table,bin等等。本质上来说,模式就是各种匹配到特定结果的匹配规则。(正则表达式匹配规则的个数)总之我们对正则表达式就是各种参数,以及各种参数组合串成的整体。
  匹配规则个数会有所不同,也就是正则表达式的长度参数个数会不同。常用的匹配规则还有aa,ff,gj这些特殊,a,g,j,r,e这些常用字符。其实也可以等价与c语言常用的ao,eo等等正则表达式语法。手机码字,格式见谅。上面其实就是最常用的正则表达式,至于函数,那更多了,只列一点比较常用的比较常用的。3w1r,hire,pipeline,find(find同width),find(find同finger),join(join同concat),replace(replace同concat),text(text同concat),text(text同join),white(white同concat),book(white同c。

webshell免杀——以PHP为例

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2022-05-10 23:45 • 来自相关话题

  webshell免杀——以PHP为例
  介
  (2)从远程URL中获取数据
  file_get_contents、curl、svn_checkout…
  将需要执行的指令数据放在远程URL中,通过URL_INCLUDE来读取
  (3)从磁盘文件中获取数据
  file、file_get_contents…
  将需要执行的指令数据放在磁盘文件中,利用IO函数来读取
  (4)从数据库中读取
  将需要执行的指令放在数据库中,利用数据库函数来读取
  (5)从图片头部中获取
  exif_read_data…
  将需要执行的指令数据放在图片头部中,利用图片操作函数来读取
  2、代码执行
  (1)常用命令执行函数
  eval、system、assert、exec、shell_exec…
  最普通、标准的代码执行
  (2)LFI
  include、require…
  利用浏览器的伪协议将文件包含转化为代码执行
  (3)动态函数执行
  $()…
  PHP的动态函数特性
  (4)Curly Syntax
  ${${…}}…
  这种思路可以把变量赋值的漏洞转化为代码执行的机会
  3、PHP一句话
  最常见的就是eval和assert:
  一些常见方法:
  二、关于WAF
  要免杀,当然得先了解是谁在杀,主要是D盾、安全狗,护卫神等,其他还有杀毒软件如火绒、360
  其检测思路大概有:
  1、基于流量和字符特征的检测
  既然是字符特征,首先就是对于一些危险函数(上面提到的那些)的检测:
  还有popen ,curl_exec,curl_multi_exec,parse_ini_file,show_source等
  然后是在返回包中检测特殊字符:root或者是其他一些敏感字符串passwd等等
  2、基于文件特征
  主要基于HASH的匹配,取决于样本的捕捉能力及形成特征列表的数量,还是会出现漏报问题。
  这里会对上传上来的文件进行分片处理,之后会对每一个片段进行hash计算,在得到所有片段的hash值后会和之前有的特征列表库进行对比。如果符合某个相似度的要求就认为该文件为webshell。
  3、基于AST语义分析
  为了弥补统计特征的不足,进一步深化,进行语法检测,关注于每个函数和参数,这种方式精确,误报较少。但是对于PHP这种动态特性很多的语言,检测就比较吃力,AST是无法了解语义的。
  其实这一部分有点类似于代码审计,核心问题就是找到那些可疑的函数。有经验的安全人员可能脑海里就有一个表,这个表里放满了各种函数,有点类似于黑名单。在找到函数调用的代码时,如果发现函数名在黑名单中,就认为这是一个“敏感”函数,再执行后续判断;如果函数名不在黑名单中,那么后续的判断也就不用继续了。但是这个名单必须得大而全,而且得考虑很多特殊情况。
  4、动/静态符号执行
  实际是就是去发现没有过滤或者过滤不完全的可控变量,一但存在用户可以控制的代码逻辑,那么危险系数就很高了。
  5、机器学习
  这个需要大量的webshell样本训练,目前来看效果可能还是不太好。而有些算法可解释性比较差,不利于运营。而且存在大量误报的可能。
  6、终极检测引擎Rasp
  在2014年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP。它是一种新型应用安全保护技术,它将保护程序像疫苗一样注入到应用程序中,应用程序融为一体,能实时检测和阻断安全攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预。
  RASP技术可以快速的将安全防御功能整合到正在运行的应用程序中,它拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。
  三、免杀思路
  下面是一些免杀的思路,但实际需要多种思路结合,办法总比困难多
  1、字符串变换
  将关键词进行拼接转换等,来绕过对关键词的检测
  一些可用的方法有:
  ucwords() //函数把字符串中每个单词的首字符转换为大写。ucfirst() //函数把字符串中的首字符转换为大写。trim() //函数从字符串的两端删除空白字符和其他预定义字符。substr_replace() //函数把字符串的一部分替换为另一个字符串substr() //函数返回字符串的一部分。strtr() //函数转换字符串中特定的字符。strtoupper() //函数把字符串转换为大写。strtolower() //函数把字符串转换为小写。strtok() //函数把字符串分割为更小的字符串str_rot13() //函数对字符串执行 ROT13 编码。
  由于eval是语言构造器而不是函数,所以不能被可变函数调用,一般会通过拼接assert来执行;又由于assert在php7.1之后无法这样使用,所以此类免杀方式基本仅能在php5环境下使用
  几个例子: <p> 查看全部

  webshell免杀——以PHP为例
  介
  (2)从远程URL中获取数据
  file_get_contents、curl、svn_checkout…
  将需要执行的指令数据放在远程URL中,通过URL_INCLUDE来读取
  (3)从磁盘文件中获取数据
  file、file_get_contents…
  将需要执行的指令数据放在磁盘文件中,利用IO函数来读取
  (4)从数据库中读取
  将需要执行的指令放在数据库中,利用数据库函数来读取
  (5)从图片头部中获取
  exif_read_data…
  将需要执行的指令数据放在图片头部中,利用图片操作函数来读取
  2、代码执行
  (1)常用命令执行函数
  eval、system、assert、exec、shell_exec…
  最普通、标准的代码执行
  (2)LFI
  include、require…
  利用浏览器的伪协议将文件包含转化为代码执行
  (3)动态函数执行
  $()…
  PHP的动态函数特性
  (4)Curly Syntax
  ${${…}}…
  这种思路可以把变量赋值的漏洞转化为代码执行的机会
  3、PHP一句话
  最常见的就是eval和assert:
  一些常见方法:
  二、关于WAF
  要免杀,当然得先了解是谁在杀,主要是D盾、安全狗,护卫神等,其他还有杀毒软件如火绒、360
  其检测思路大概有:
  1、基于流量和字符特征的检测
  既然是字符特征,首先就是对于一些危险函数(上面提到的那些)的检测:
  还有popen ,curl_exec,curl_multi_exec,parse_ini_file,show_source等
  然后是在返回包中检测特殊字符:root或者是其他一些敏感字符串passwd等等
  2、基于文件特征
  主要基于HASH的匹配,取决于样本的捕捉能力及形成特征列表的数量,还是会出现漏报问题。
  这里会对上传上来的文件进行分片处理,之后会对每一个片段进行hash计算,在得到所有片段的hash值后会和之前有的特征列表库进行对比。如果符合某个相似度的要求就认为该文件为webshell。
  3、基于AST语义分析
  为了弥补统计特征的不足,进一步深化,进行语法检测,关注于每个函数和参数,这种方式精确,误报较少。但是对于PHP这种动态特性很多的语言,检测就比较吃力,AST是无法了解语义的。
  其实这一部分有点类似于代码审计,核心问题就是找到那些可疑的函数。有经验的安全人员可能脑海里就有一个表,这个表里放满了各种函数,有点类似于黑名单。在找到函数调用的代码时,如果发现函数名在黑名单中,就认为这是一个“敏感”函数,再执行后续判断;如果函数名不在黑名单中,那么后续的判断也就不用继续了。但是这个名单必须得大而全,而且得考虑很多特殊情况。
  4、动/静态符号执行
  实际是就是去发现没有过滤或者过滤不完全的可控变量,一但存在用户可以控制的代码逻辑,那么危险系数就很高了。
  5、机器学习
  这个需要大量的webshell样本训练,目前来看效果可能还是不太好。而有些算法可解释性比较差,不利于运营。而且存在大量误报的可能。
  6、终极检测引擎Rasp
  在2014年的时候,Gartner引入了“Runtime application self-protection”一词,简称为RASP。它是一种新型应用安全保护技术,它将保护程序像疫苗一样注入到应用程序中,应用程序融为一体,能实时检测和阻断安全攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预。
  RASP技术可以快速的将安全防御功能整合到正在运行的应用程序中,它拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。Web和非Web应用程序都可以通过RASP进行保护。该技术不会影响应用程序的设计,因为RASP的检测和保护功能是在应用程序运行的系统上运行的。
  三、免杀思路
  下面是一些免杀的思路,但实际需要多种思路结合,办法总比困难多
  1、字符串变换
  将关键词进行拼接转换等,来绕过对关键词的检测
  一些可用的方法有:
  ucwords() //函数把字符串中每个单词的首字符转换为大写。ucfirst() //函数把字符串中的首字符转换为大写。trim() //函数从字符串的两端删除空白字符和其他预定义字符。substr_replace() //函数把字符串的一部分替换为另一个字符串substr() //函数返回字符串的一部分。strtr() //函数转换字符串中特定的字符。strtoupper() //函数把字符串转换为大写。strtolower() //函数把字符串转换为小写。strtok() //函数把字符串分割为更小的字符串str_rot13() //函数对字符串执行 ROT13 编码。
  由于eval是语言构造器而不是函数,所以不能被可变函数调用,一般会通过拼接assert来执行;又由于assert在php7.1之后无法这样使用,所以此类免杀方式基本仅能在php5环境下使用
  几个例子: <p>

php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS

网站优化优采云 发表了文章 • 0 个评论 • 66 次浏览 • 2022-05-10 23:39 • 来自相关话题

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS 查看全部

  php正则函数抓取网页连接 CMS真的安全吗?洞鉴PHPCMS
  什么是PHPCMS
  说到PHPCMS,就不得不先提一提CMS。CMS全称“Content Management System”,意为“内容管理系统”,内容管理系统是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。
  这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。内容管理还可选地提供内容抓取工具,将第三方信息来源,比如将文本文件、HTML网页、Web服务、关系数据库等的内容自动抓取,并经分析处理后放到自身的内容库中。
  随着个性化的发展,内容管理还辅助WEB前端将内容以个性化的方式提供给内容使用者,即提供个性化的门户框架,以基于WEB技术将内容更好地推送到用户的浏览器端。
  PHPCMS由国内80后知名创业者钟胜辉于2005年创办,是国内知名内容管理系统,它是一款基于 PHP 技术和 AJAX 技术的企业级网站内容管理系统,旨在帮助用户解决日益复杂与重要的 Web 内容的创建、维护、发布和应用。
  PHPCMS的创立赶上了CMS蓬勃发展的时期,而且它将模块化开发方式做为功能开发形式,框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求,所以迅速占领了国内的内容管理系统领域的大片领土。
  从2005年PHPCMS第一版创立,到2007年推出PHPCMS 2007版本,再到2008年年底推出了PHPCMS 2008版本,四年三大版本均赢得了市场好评,最终在2010年盛大在线收购PHPCMS后,PHPCMS推出了主线产品PHPCMS V9版本,到2017年5月推出了最新的V9.6.3版本,PHPCMS仍为现在国内领先的内容管理系统,是各大站长建站的首选。
  根据全网数据统计,使用PHPCMS的网站多达4万多个,其中大部分集中在国内,共有约3万余个,占使用量的75%以上,同时,PHPCMS在教育行业约有上千个网站使用,在政府部门的网站中,也有上百个网站使用,其他则用于商业用途,具体分布如下图:
  
  从图中可以看出,PHPCMS的使用范围较广,其中在政府部门中不乏市县级政府这样的客户;教育行业内,也不乏国内大学的校级、院系官网使用PHPCMS作为其发布信息的官方主页;商业用途中,PHPCMS也备受中小型企业的青睐。
  PHPCMS的版本更新迭代速度以及功能齐全等特性也为其快速扩张提供发展基础。但是,PHPCMS安全吗?
  PHPCMS安全吗?
  根据千里目实验室漏洞库的统计,PHPCMS从创办到如今近十三年,产品三大版本的漏洞总量高达100余个,其中核心版本PHPCMS2008系列、PHPCMS V9系列高危漏洞近40个,在40个漏洞之中,全网公布的高可利用性漏洞个数也高达两位数,其中尤其PHPCMS V9最多,所以,PHPCMS的安全性一直备受广大用户的质疑。
  经过对PHPCMS高危漏洞的分析整理以及统计,PHPCMS的高危漏洞类型主要有以下五类:SQL注入类、命令执行类、任意文件上传类、任意文件下载类、任意文件读取类。其中SQL注入问题是最为严重的一类,不管数量还是威胁性都是其中最高的,5类漏洞的数量具体分布占比如下图。接下来按照这些漏洞中威胁性最高的五类漏洞来介绍PHPCMS的经典漏洞,以及漏洞间的共性和漏洞成因。
  
  2.1 SQL注入漏洞
  PHPCMS框架层面分析
  PHPCMS的核心版本中,PHPCMS v9的SQL注入问题比PHPCMS 2008要严重很多,这是为什么?
  首先从PHPCMS的框架上分析了这个问题的原因。PHPCMS2008中对GPC变量的处理, 是在
  include/common.inc.php中使用$db->escape($_GET)对输入变量进行转义,实质上是调用了
  mysql_real_escape_string,PHP手册上对这个函数的描述:
  string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )
  #本函数将 unescaped_string中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于 mysql_query()
  也就是说PHPCMS 2008中使用mysql_real_escape_string对输入变量进行处理,是可以达到防注入效果的,PHPCMS2008中这样的处理方式是比较安全的,但是也有其不合理的一面,原因在于:入口中对所有变量进行mysql_real_escape_string处理,显然并不是所有变量需要入库,这样处理必须影响性能(连接mysql->发送变量至mysql server ->mysql server转义->返回给PHP程序)。
  而PHPCMS V9在入口文件phpcms/libs/classes/param.class.php中采用以下方式:
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  new_addslashes其实就是调用了PHP内置的addslashes对GPC变量添加转义斜线,这就相当于php.ini中打开了magic_quotes_gpc选项,PHP手册中对magic_quotes_gpc的处理有以下描述:
  Warning
  This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  从PHP 5.4.0开始,已经不支持magic_quotes_gpc了,这是为什么?
  (1)性能:由于并不是每一段被转义的数据都要插入数据库的,如果所有进入 PHP 的数据都被转义的话,那么会对程序的执行效率产生一定的影响。
  (2)方便性:由于不是所有数据都需要转义,在不需要转义的地方看到转义的数据就很烦。比如说通过表单发送邮件,结果看到一大堆的 \'。
  (3)安全问题:事实上addslashes或开启magic_quotes_gpc并不能完全杜绝SQL注入。因为addslashes对有些特殊字符后跟上'(单引号)并不会加把这个'变成/',如:0xbf27的字就不会,所以縗' OR 1 limit 1/* 这个就存在。
  针对这个问题,PDO扩展而生,它主要解决两个问题:批量查询时使用prepare提升查询性能,使用参数化查询从根本上杜绝SQL注入,但是PHPCMS V9的phpcms\libs\classes\param.class.php依旧使用以下代码,所这就是造成PHPCMS中SQL注入如此之多的根本原因。:
  private $route_config = '';
  public function __construct() {
  if(!get_magic_quotes_gpc()) {
  $_POST = new_addslashes($_POST);
  $_GET = new_addslashes($_GET);
  $_REQUEST = new_addslashes($_REQUEST);
  $_COOKIE = new_addslashes($_COOKIE);
  PHPCMS漏洞层面分析
  从具体的漏洞来看,PHPCMS代码中出现的SQL注入点主要有三种情况:
  第一种情况,即外部可控参数未进行任何过滤,这种问题是因为系统设计人员代码设计的不严谨导致。其中最经典的PHPCMS v9 前台用户登录处SQL注入漏洞产生即是因为这个原因:用户在登录页面输入用户名与密码,在\phpcms\modules\member\index.php的login方法中,username使用的is_username进行了过滤而password没有做任何处理。
  $username = isset($_POST['username']) && is_username($_POST['username']) ?
  trim($_POST['username']) : showmessage(L('username_empty'), HTTP_REFERER);
  $password = isset($_POST['password']) && trim($_POST['password']) ?
  trim($_POST['password']) : showmessage(L('password_empty'), HTTP_REFERER);
  $cookietime = intval($_POST['cookietime']);
  $synloginstr = ''; //同步登陆js代码
  所以,Password就成为了一个注入点。输入的username以及password被传到phpsso模块中进行认证,而phpsso模块并没有解析过滤用户名与密码就直接进行认证,认证后直接将信息返回到登录页面的login方法中。
  第二种情况也是SQL注入中的经典情形,即代码中处理外部输入数据的时候使用了urldecode()函数。比如单引号被 urlencode 两次以后是 %2527,然后 POST。PHP 内部在生成全局变量 $_POST 的时候会先 urldecode,得到 %27,然后 PHP 会检查 Magic Quotes 的设置,但是无论是否开启 Magic Quotes,%27 都不会被 addslashes,因为这时根本没有单引号。
  但是这时如果你在 PHP 代码中画蛇添足的加上 urldecode,%27就变成单引号了,这样就成功绕过了,这种情况出现的根源在于之前分析的PHPCMS使用magic_quotes_gpc这种方式来处理外部数据。
  PHPCMS V9 WAP SQL注入漏洞即是因为这种情况:
  function comment_list() {
  $WAP = $this->wap;
  $TYPE = $this->types;
  $comment = pc_base::load_app_class('comment','comment');
  pc_base::load_app_func('global','comment');
  $typeid = intval($_GET['typeid']);
  $GLOBALS['siteid'] = max($this->siteid,1);
  $commentid = isset($_GET['commentid']) && trim(urldecode($_GET['commentid'])) ?
  trim(urldecode($_GET['commentid'])) : exit('参数错误');
  list($modules, $contentid, $siteid) = decode_commentid($commentid);
  list($module, $catid) = explode('_', $modules);
  $comment_setting_db = pc_base::load_model('comment_setting_model');
  $setting = $comment_setting_db->get_one(array('siteid'=>$this->siteid));
  这段代码中在处理外部可控参数commentid的时候,使用了urldecode()函数,最终可以采用%2527的方式来进行过滤绕过。
  PHPCMS db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename'];
  $this->db->table_name = $tablename.'_data';
  $rs = $this->db->get_one(array('id'=>$id)); //id传入sql查询语句
  在函数中,代码通过GET获取'a_k'值,并调用sys_auth函数进行解密,然后使用parse_str()来解析解密后的$a_k参数,将字符串解析到变量中,并同时解码。在parse_str()解析的过程中,就将之前构造好的SQL注入paylaod赋值到各个参数,并且绕过了所有限制。
  这个漏洞利用还有另一个关口,就是需要将payload使用sys_auth加密,同样,PHPCMS一个任意文件下载漏洞也是这个原理:构造payload—>sys_auth加密—>带入到phpcms\modules\content\
  down.php文件init函数中—>进行解码并parse_str()解析,payload通过这种方式可以绕过所有过滤关口,最终成功触发。
  从之上的分析可知,所有的SQL注入漏洞其根源都在magic_quotes_gpc方法上。但是除了框架之外,如此多的SQL注入问题就在于程序员对待代码逻辑的不严谨,缺少对外部可控参数的过滤或者说是缺少完全的过滤验证过程,PHP是很灵活的语言,其代码的逻辑严谨程度即代表着它的安全性高低!
  命令执行漏洞
  命令执行是一类威胁性非常大的漏洞类型,大多数“一锅端”(能够getshell,控制全站)漏洞都是命令执行漏洞。由之前的漏洞数量分布可知,命令执行问题的数量仅次于SQL注入,但是它的严重程度可能更甚于SQL注入漏洞。
  PHPCMS框架中的命令执行漏洞大部分都是由于一个函数,即global.func.php中的string2array()函数,函数代码如下:
  /**
  * 将字符串转换为数组
  *
  * @param string $data 字符串
  * @return array 返回数组格式,如果,data为空,则返回空数组
  */
  function string2array($data) {
  $data = trim($data);
  if($data == '') return array();
  if(strpos($data, 'array')===0){
  @eval("\$array = $data;");
  }else{
  if(strpos($data, '{\\')===0) $data = stripslashes($data);
  $array=json_decode($data,true);
  if(strtolower(CHARSET)=='gbk'){
  $array = mult_iconv("UTF-8", "GBK//IGNORE", $array);
  }
  }
  return $array;
  }
  该函数中使用了eval函数,这就代表所有调用这个函数的地方,如果存在过滤不严的情况,都会出现严重的命令执行漏洞。当然,我们不用怀疑程序员写BUG的能力,PHPCMS中多个命令执行漏洞都是因为外部参数未进行严格过滤,就直接带进了string2array()中进行处理,所以最终触发了漏洞。
  其中最经典的一个漏洞PHPCMS 2008任意代码执行漏洞,该漏洞利用门槛之低让人大跌眼镜,漏洞的出处就在yp/web/include/common.inc.php的menu变量:
  $menu = string2array($menu);
  $siteurl = $m_s_url[1] = $M['url'].'web/?'.$userid;
  $introduceurl = $m_s_url[2] = $siteurl.'/category-introduce.html';
  $newsurl = $m_s_url[3] = $siteurl.'/category-news.html';
  $product = $m_s_url[4] = $siteurl.'/category-product.html';
  $buyurl = $m_s_url[5] = $siteurl.'/category-buy.html';
  $joburl = $m_s_url[6] = $siteurl.'/category-job.html';
  $joburl = $m_s_url[7] = $siteurl.'/category-certificate.html';
  $guestbookurl = $m_s_url[8] = $siteurl.'/category-guestbook.html';
  $contacturl = $m_s_url[9] = $siteurl.'/category-contact.html';
  Menu参数是一个外部可控参数,该参数被被传进后台之后未经过任何处理以及限制,导致在string2array()函数中直接被eval函数执行,导致远程代码执行漏洞。
  而这个函数从PHPCMS 2008到PHPCMS V9一直都存在,而该系统程序员也只是在之后每一个调用此函数的地方都先对传入参数进行过滤或者限制,但是任何过滤限制都有被绕过的可能,之后的事实证明确实如此,比如之后再V9版本出现的PHPCMS V9 phpcms\
  modules\dbsource\data.php出现的远程命令执行漏洞,PHPCMSV9 /phpcms/modules/vote/
  index.php代码执行漏洞等均是因为这个原因。
  所以,防止PHP程序出现代码执行漏洞有一条金科玉律:永远不要在代码中使用eval。
  因为,很少有人能够掌控住这个函数,一旦控制不住,可能就会出现一个“一锅端”的命令执行漏洞。
  另外PHPCMS中出现的一个PHPCMS /phpsso_server/phpcms/modules/phpsso/index.php代码执行漏洞,它的思想很特别、也很典型。该漏洞中存在的一个猛兽理论值得很多程序员以及安全研究人员来认真研究的。“猛兽来了,我们应该将其绝杀在门外,但是有些人非得把它放进屋内,才杀之,你们难道不知道猛兽的嘴里可能叼了一个炸药包吗? 砰!!!结果全都玩完了…”。下面用具体代码来解释这个理论。
  其中:
  猛兽放进室内:copy($_GET['src'],$_GET['dst']);
  这条猛兽不安全,杀之:unlink($_GET['dst']);
  炸药包:$_GET['dst'] 此炸药包的作用是生成恶意文件。
  这段代码中存在缺陷的地方就是将“猛兽”放进市内的地方:
  copy($_GET['src'],$_GET['dst']);
  可将任意文件copy成恶意文件,如木马,后来发现这个文件不安全,然后使用unlink将之删除...,但是,有种可能就是木马在删除之前,生成了新的木马文件,结果可想而知。
  PHPCMS V9
  /phpsso_server/phpcms/modules/phpsso/index.php任意命令执行就是这个原理。首先上传头像,头像的格式被压缩为zip格式文件,然后文件到了/phpsso_server/phpcms/modules/phpsso/index.php的uploadavatar()函数,首先被解压,然后判断为非jpg文件后删除。攻击者利用这个漏洞的过程中是将webshell保存为jpg中,构造后缀名突破jpg的限制,在文件被上传解压后,webshell执行在上层目录生成一个新的webshell文件,由此触发漏洞。
  命令执行漏洞的威胁性极大,在任何代码审计中,只要代码中出现了eval,assert等这类代码执行函数后,都有可能出现代码执行漏洞。并且猛兽理论也应该在被关注,这样的逻辑在很多代码中都会被用到,其解决的方法即应该在第一步的时候就处理风险,不能将“猛兽放进屋来”。
  任意文件上传漏洞、任意文件下载、任意文件读取漏洞
  这三类漏洞是关于文件操作的漏洞,具有很多的共性。PHPCMS中的任意文件上传漏洞主要是因为文件上传过程中,文件类型的限制不严或者因为存在过滤限制绕过,导致可以上传一些可执行文件,最终GetShell。该类漏洞与代码执行很相似,最根本就是为了执行上传文件中的恶意代码。
  其中PHPCMS v9 注册页面任意文件上传漏洞和PHPCMS v9.6.1 后缀名提取导致任意文件上传漏洞都是一种采用构造后缀名绕过限制过滤的漏洞。第一个漏洞中的正则要求输入满足src/href=url.(gif|jpg|jpeg|bmp|png),则构造的(
  
  )符合这一格式(这也就是为什么后面要加.jpg的原因)。之后通过一系列处理,将.jpg去掉,那么最后文件的后缀就变成了.php成为了可执行文件。
  而第二个漏洞中则因strtolower(trim
  (substr(strrchr($filename, '.'), 1, 10)));处理被绕过,攻击这可以使用/1.thumb_.Php.JPG%20%20
  %20%20%20%20%20Php来绕过过滤,最终由于apache的文件名解析特性(可以去掉空格)导致上传文件里php代码最终被解析执行。所以该类漏洞中,都是因为对文件名后缀缺少更严谨的处理,导致上传可执行文件最终导致getshell。
  PHPCMS

PHP代码审计之敏感函数参数回溯法

网站优化优采云 发表了文章 • 0 个评论 • 79 次浏览 • 2022-05-03 01:27 • 来自相关话题

  PHP代码审计之敏感函数参数回溯法
  ‍‍前言
  代码审计,是对应用程序源代码进行系统性检查的工作。目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。
  代码审计常用工具
  
  Seay源代码审计系统、Fortify SCA、RIPS
  
  敏感函数参数回溯法
  
  根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的。我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。这方面,Seay法师大大有一款神器Seay源代码审计系统,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。然后,我们就可以分析判断敏感函数的上下文,追踪参数源头。
  (1) 根据敏感关键字回溯参数传递过程。
  (2) 查找可控变量,正向追踪变量传递过程。
  (3) 寻找敏感功能点,通读功能点代码、
  (4) 直接通读全文代码
  
  回溯过程
  
  这里用seay源代码审计系统举例:
  打开某CMS源代码,先点击新建项目
  
  选择解压出来的源代码的根目录,然后点击确定
  
  点击自动审计,再点击开始
  
  可以看到自动审计根据敏感函数列出了可能存在的漏洞
  
  
  敏感函数列举
  
  函数回溯发审计常用漏洞
  Xss 审计:
  1.反射xss一般seay可以直接搜索str_replace关键字,也可以通过手工搜索来寻找
  2.存储型 XSS全局搜索数据库的插入语句(关键词:insert,save,update),然后找到该插入语句所属的方法名如 (insertUser()),然后全局搜索该方法在哪里被调用,一层层的跟踪
  SQL 注入:
  一般直接搜索select、update、delete、insert 关键词就会有收获,如果 sql 语句中有出现+、 append、 $、 ()、 # 等字眼,如果没有配置SQL 过滤文件,则判断存在 SQL 注入漏洞
  任意文件下载:
  审计方法:全局搜索以下关键词 fileName、filePath、getFile、getWriter、download
  查看下载文件或路径是否可控
  文件上传:
  文件上传可以搜索以下关键词:(需注意有没有配置文件上传白名单)
  upload、write、fileName 、filePath
  在查看时,主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单
  文件包含:
  直接搜索include、require、include_once、require_once
  Ssrf:
  搜索函数跟踪请求file_get_contents、fsockopen、curl_exec
  CSRF:
  审计方法:通过查看配置文件有没有配置 csrf 全局过滤器,如果没有则重点看每个操作前有没有添加 token 的防护机制
  
  审计思路
  
  先用小皮搭建好我们的cms用来复现漏洞
  
  安装完成
  开始审计
  后台链接添加处admin/link.php ,siteurl参数输出时未进行实体化处理导致,存储型xss。在$action=addlink时,通过addslashes函数进行转义处理,防止进行sql注入,但是未进行任何的html实体化,或者过滤处理。通过第44行代码可发现进行了正则匹配所以我们构造的payload需以http、ftp开头,才能进型数据插入。
  
  通过addLink函数插入链接,接下来跟进/include/model/link_model.php中的link_Model-&gt;addLink函数,该函数将经过addslashes转义完的链接插入数据库 进行存储。
  
  接下来跟进输出情况,当action参数为空,通过/include/model/link_model.php中的Link_Model-&gt;getLinks()函数从数据库查询sitename、description、siteurl,并返回查询结果,最后由View::output()进行输出。getLinks()函数查询数据库获取,获取sitename、description、siteurl数据,查看可发现未对siteurl参数进行实体化和过滤处理。
  
  查看/include/lib/view.php 中的View::output函数,最后结果通过echo输出,在整个过程都未对siteurl进行实体化、过滤处理,导致最终造成存储型xss。
  
  验证一下‍‍
  
  
   查看全部

  PHP代码审计之敏感函数参数回溯法
  ‍‍前言
  代码审计,是对应用程序源代码进行系统性检查的工作。目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。
  代码审计常用工具
  
  Seay源代码审计系统、Fortify SCA、RIPS
  
  敏感函数参数回溯法
  
  根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的。我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。这方面,Seay法师大大有一款神器Seay源代码审计系统,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。然后,我们就可以分析判断敏感函数的上下文,追踪参数源头。
  (1) 根据敏感关键字回溯参数传递过程。
  (2) 查找可控变量,正向追踪变量传递过程。
  (3) 寻找敏感功能点,通读功能点代码、
  (4) 直接通读全文代码
  
  回溯过程
  
  这里用seay源代码审计系统举例:
  打开某CMS源代码,先点击新建项目
  
  选择解压出来的源代码的根目录,然后点击确定
  
  点击自动审计,再点击开始
  
  可以看到自动审计根据敏感函数列出了可能存在的漏洞
  
  
  敏感函数列举
  
  函数回溯发审计常用漏洞
  Xss 审计:
  1.反射xss一般seay可以直接搜索str_replace关键字,也可以通过手工搜索来寻找
  2.存储型 XSS全局搜索数据库的插入语句(关键词:insert,save,update),然后找到该插入语句所属的方法名如 (insertUser()),然后全局搜索该方法在哪里被调用,一层层的跟踪
  SQL 注入:
  一般直接搜索select、update、delete、insert 关键词就会有收获,如果 sql 语句中有出现+、 append、 $、 ()、 # 等字眼,如果没有配置SQL 过滤文件,则判断存在 SQL 注入漏洞
  任意文件下载:
  审计方法:全局搜索以下关键词 fileName、filePath、getFile、getWriter、download
  查看下载文件或路径是否可控
  文件上传:
  文件上传可以搜索以下关键词:(需注意有没有配置文件上传白名单)
  upload、write、fileName 、filePath
  在查看时,主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单
  文件包含:
  直接搜索include、require、include_once、require_once
  Ssrf:
  搜索函数跟踪请求file_get_contents、fsockopen、curl_exec
  CSRF:
  审计方法:通过查看配置文件有没有配置 csrf 全局过滤器,如果没有则重点看每个操作前有没有添加 token 的防护机制
  
  审计思路
  
  先用小皮搭建好我们的cms用来复现漏洞
  
  安装完成
  开始审计
  后台链接添加处admin/link.php ,siteurl参数输出时未进行实体化处理导致,存储型xss。在$action=addlink时,通过addslashes函数进行转义处理,防止进行sql注入,但是未进行任何的html实体化,或者过滤处理。通过第44行代码可发现进行了正则匹配所以我们构造的payload需以http、ftp开头,才能进型数据插入。
  
  通过addLink函数插入链接,接下来跟进/include/model/link_model.php中的link_Model-&gt;addLink函数,该函数将经过addslashes转义完的链接插入数据库 进行存储。
  
  接下来跟进输出情况,当action参数为空,通过/include/model/link_model.php中的Link_Model-&gt;getLinks()函数从数据库查询sitename、description、siteurl,并返回查询结果,最后由View::output()进行输出。getLinks()函数查询数据库获取,获取sitename、description、siteurl数据,查看可发现未对siteurl参数进行实体化和过滤处理。
  
  查看/include/lib/view.php 中的View::output函数,最后结果通过echo输出,在整个过程都未对siteurl进行实体化、过滤处理,导致最终造成存储型xss。
  
  验证一下‍‍
  
  
  

记一次反编译小程序寻找签名函数并联动bp插件自动化加签

网站优化优采云 发表了文章 • 0 个评论 • 93 次浏览 • 2022-05-02 04:25 • 来自相关话题

  记一次反编译小程序寻找签名函数并联动bp插件自动化加签
  文章首发于:
  火线Zone社区()
  0x00 前言
  日常渗透测试中,在进行数据包的重放或者是篡改数据包时,会碰到一些存在数据加密或加签的站点,这时我们就得寻找加签或者加密的算法,而这寻找过程往往有一定难度。
  总的来讲,对于数据解密或者加签破解的难度:app&gt;web≥wxapp,同时api接口都是相同的,为降低不必要的挖洞难度,可将目光放到微信小程序上。本次就是以一个微信小程序站点开展的测试。
  0x01 拖取微信小程序包
  这里简单说下,目前微信小程序在pc端貌似已经有加密了,Mac(/Users/{系统用户名}/Library/Containers/com.tencent.xinWeChat/Data/Library/Containers/com.tencent.xinWeChat/Data/Library/Caches/com.tencent.xinWeChat/{微信版本号}/{用户ID}/WeApp/LocalCache/release/{小程序ID}/)、Windows(C:\Users\{系统用户名}\Documents\WeChat Files\Applet\{小程序ID}\),而我们这边可以去拖安卓端的小程序包。
  这里需要提前准备好一个已经root过的安卓手机或者是一个安卓模拟器,先去/data/data/com.tencent.mm/MicroMsg/{一串16进制字符}/appbrand/pkg 这个目录下将其他小程序包都删除掉,然后再打开微信加载我们需要测试的目标小程序。
  此处注意,一定要等小程序完全打开并且再点几个功能,确保将所有包都运行,由于目前的小程序体量逐渐变大,可能会有多个子包的存在。
  
  
  然后将相关子包拖出来。
  0x02 反编译小程序拿源码
  在将相关子包拖出来并放在我们指定的目录,然后用wxappUnpacker工具将包反编译出来。
  node wuWxapkg.js ../20220323/debug_607957350_2_511127914.wxapkg
  在原本存放小程序的目录下会出现一个以小程序包名的子文件夹,反编译出来的源码就在里面。
  
  用微信官方开发工具打开源码项目:
  1、选择“导入项目”,“AppID”选择测试号并导入
  2、到“本地设置”模块,勾选上“不校验合法域名”功能
  
  
  0x03 寻找签名加密函数
  案例背景环境
  介绍一下本次示例案例的背景环境。
  在这⾥通过抓包发现站点有使⽤签名来鉴定提交数据的完整性, 经⼿⼯测试,发现修改任意带有值的参数,都会导致服务器端报错提示"签名错误”
  
  
  这里简单介绍一种快速定位JavaScript中关键加密函数的方法--关键字寻找
  关键字寻找
  1.1、在项目中全局搜索关键字
  常见的通用关键字例如key、encrypt、iv、sign、password、rsa、aes等
  1.2、搜索加签加密接口名
  例如此处接口名为/xxxxxxing1/f**dinfo/getfundranklist/1.0,可以搜其拆分的路由名称:xxxxxxing1f**dinfogetfundranklist
  1.3、搜索相关涉及到加签加密的参数名
  例如此处则可以搜索oftypeopenapi_signparamsDigestordercol等
  在介绍完背景和方法后,可以开始寻找加签函数了。
  定位加签函数
  在相关开发者工具中,全局搜索openapi
  
  发现有两个js存在,进入这两个js继续定位关键的位置。
  发现openapi关键字都存在于同一个关键函数(说明:这里后面经过对比两个js文件,发现内容大致相同而app-service.js不存在乱码情况,故后面都以此js进行跟踪分析)
  
  openapi_sign参数存在于getSecretSign方法中,同时另外⼀个请求体里的参数paramsDigest也 在⾥⾯,这根据这个命名⼤概推测该⽅法可能是⽤于签名。
  
  继续搜索此方法名getSecretSign,看看该方法是否有被调用到,发现了关键形参:t.data、 r.secretkey。
  
  继续上下⽂搜索t.data,发现⼀个关键点,阅读相关js代码,发现⾥⾯的 json字符串就是从数据包参数 ⾥⾯获取的,然后调⽤Object.assign⽅法将json串复制到t.data当中。
  
  由于r.secretkey未能搜索到,故尝试搜索secretkey关键字看看能不能找到些啥,发现刚好存在 ⼀个secretkey,至此可以⼤致判定我们最初找的getSecretSign为加签⽅法。
  
  0x04 编写加签函数
  本地起一个js脚本,将0x03中找到的加签函数写入,提供必要的参数值,运行测试下。
  
  结果报错提示r对象未被定义,阅读代码发现,r对象只是用于提供它的hex()方法,返回项目源码当中寻找hex()方法。
  
  然后往上面跟代码发现此处是引用了github上的一个MD5加密算法github。
  这里直接将src目录下的md5代码复制下来,贴到我们测试的js文件当中。
  
  执行js脚本文件,无报错。同时对⽐发现签名⼀致。⾄此相关加签函数已找到并能成功调⽤运⾏。
  
  
  0x05 联动burp插件
  加签算法已破解,为了能更提高实际渗透测试过程中的效率,可以联动burp插件,使得当我们篡改数据时能自动化的运行加签算法,直接得到相关签名。
  在这里我首先尝试了burpCrypto插件,但调试js阶段发现一直有报错,同时在插件上未找到详细错误信息,而jsencrypter会将错误信息直接地抛出在命令行页面上,更有利于代码调试,故此处选择的是jsencrypter插件。
  简单介绍一下jsencrypter插件:
  
  jsencrypter使用phantomjs启动前端加密函数对数据进行加密,方便对加密数据输入点进行fuzz,比如可以使用于前端加密传输爆破等场景。工具本身提供了几种常见加密算法,可以直接引用,当加密加签算法为非常规时,也可以引用我们自定义算法进行破解。
  phantomjs是已停产的无头浏览器,用于自动进行网页交互。PhantomJS提供了一个JavaScript API,可实现自动导航,屏幕截图,用户行为和断言,使其成为在无头系统(如持续集成环境)中运行基于浏览器的单元测试的常用工具。
  Jsencrypter的使用
  按照插件的说明,复制了一份原来的phantomJS调用模板,按照文档注释说明,修改了引用的js文件,以及后续调用的方法。
  
  在⽤于加签的js中,将在0x04章节中成功加签的js代码复制过来,并在后面给其设置一个get方法,用于返回签名。
  function get(pass){     var pass1 = eval("("+pass+")");     var call = test(pass1,t);     var str = 'paramsDigest:'+call.paramsDigest+'-------'+'openapi_sign:'+call.openapi_sign;     return str;     }
  命令行中敲入命令,运行phantomjs
  >phantomjs js1.js[*] load js successful[!] ^_^[*] jsEncrypterJS start![+] address: http://127.0.0.1:1664
  然后bp上点击test发送数据,可以看到相关的sign值完全正确。(此处sign值与前面图对应)
  
  自动化改进
  原先js脚本,只是回显了sign,但实际过程中,我们还是需要cv⼤法将openapi_signparamsDigest以及我们篡改后的数据串值重新丢⼊repeater中,其实可以通过js正则,进⾏修改输出,省去这⼀步。
  首先定义一个unchange方法,用于将json串转成参数串。
  function unchange(b){  var str = b,p1;  p1 = str.split(':"').join('=');  p1 = p1.split('",').join('&');  p1 = p1.replace('{','');  p1 = p1.replace('"}','');  return p1;}
  然后连接符+缝合起来
       var str = unchange(pass)+'&paramsDigest='+call.paramsDigest+'&openapi_sign='+call.openapi_sign;     return str;
  看看实际效果
  
  可以直接在插件上篡改参数值,然后复制结果到repeater中进行安全测试。
  
  自动化改进2
  但是这个地方,我们还是需要将数据先转化成非标准的json字符串。这里我尝试了在插件里面的js中进行修改,但是由于相关数据本身就包括了xxx&amp;xxx1&amp;xxx2,而&amp;在HTTP请求中会当做一个分割参数符,这会导致参数传到server端中时,只剩下一个xxx参数,其余的都被丢弃了。
  这里本想先将数据base编码,再传输过去,但思考下其实多此一举,在调用插件前还需要编码,加密前还需要先解码,这更复杂,还不如直接写个js,将数据转成json字符串后再丢给插件。
  故使用曲线救国的方式,写了一个js,用于自动化生成json串。
  function change(b){  var str = b,p1;  p1 = str.split('=').join(':"');  p1 = p1.split('&').join('",');  p1 = p1.replace(/^/,'{');  p1 = p1.replace(/$/,'"}');  return p1;}<br />var str = 'secuid=JY208740&udid=&sysVer=5.7.7&appName=&systemInfo=%2C%2C%2C&softName=WXIN_O&tradeClient=H5Trade&device_model=&deviceVers=&hwID=&conn_style=2.460.01.0.0&mip=&mac=&imsi=&iccid=&rNetAddr=&packtm=&reqtime=&operway=W&operorg=&netAddr=13888888888&session=12f4530351a3********7b6d8dec3c36f60dce1e83e03329d42fc269&userCode=334507******1792&pkg=H_117292&fundid=';  console.log(change(str));
  
  至此,除了需要手动执行转化数据串为json串外,勉强实现了自动化修改数据(不是
  0x06 涉及到的工具下载方式
  以上工具可到原文中下载:
  包含以下工具:
  第一次写文章,有什么不对的地方还请各位师傅斧正。
  【火线Zone云安全社区群】
  进群可以与技术大佬互相交流
  进群有机会免费领取节假日礼品 查看全部

  记一次反编译小程序寻找签名函数并联动bp插件自动化加签
  文章首发于:
  火线Zone社区()
  0x00 前言
  日常渗透测试中,在进行数据包的重放或者是篡改数据包时,会碰到一些存在数据加密或加签的站点,这时我们就得寻找加签或者加密的算法,而这寻找过程往往有一定难度。
  总的来讲,对于数据解密或者加签破解的难度:app&gt;web≥wxapp,同时api接口都是相同的,为降低不必要的挖洞难度,可将目光放到微信小程序上。本次就是以一个微信小程序站点开展的测试。
  0x01 拖取微信小程序包
  这里简单说下,目前微信小程序在pc端貌似已经有加密了,Mac(/Users/{系统用户名}/Library/Containers/com.tencent.xinWeChat/Data/Library/Containers/com.tencent.xinWeChat/Data/Library/Caches/com.tencent.xinWeChat/{微信版本号}/{用户ID}/WeApp/LocalCache/release/{小程序ID}/)、Windows(C:\Users\{系统用户名}\Documents\WeChat Files\Applet\{小程序ID}\),而我们这边可以去拖安卓端的小程序包。
  这里需要提前准备好一个已经root过的安卓手机或者是一个安卓模拟器,先去/data/data/com.tencent.mm/MicroMsg/{一串16进制字符}/appbrand/pkg 这个目录下将其他小程序包都删除掉,然后再打开微信加载我们需要测试的目标小程序。
  此处注意,一定要等小程序完全打开并且再点几个功能,确保将所有包都运行,由于目前的小程序体量逐渐变大,可能会有多个子包的存在。
  
  
  然后将相关子包拖出来。
  0x02 反编译小程序拿源码
  在将相关子包拖出来并放在我们指定的目录,然后用wxappUnpacker工具将包反编译出来。
  node wuWxapkg.js ../20220323/debug_607957350_2_511127914.wxapkg
  在原本存放小程序的目录下会出现一个以小程序包名的子文件夹,反编译出来的源码就在里面。
  
  用微信官方开发工具打开源码项目:
  1、选择“导入项目”,“AppID”选择测试号并导入
  2、到“本地设置”模块,勾选上“不校验合法域名”功能
  
  
  0x03 寻找签名加密函数
  案例背景环境
  介绍一下本次示例案例的背景环境。
  在这⾥通过抓包发现站点有使⽤签名来鉴定提交数据的完整性, 经⼿⼯测试,发现修改任意带有值的参数,都会导致服务器端报错提示"签名错误”
  
  
  这里简单介绍一种快速定位JavaScript中关键加密函数的方法--关键字寻找
  关键字寻找
  1.1、在项目中全局搜索关键字
  常见的通用关键字例如key、encrypt、iv、sign、password、rsa、aes等
  1.2、搜索加签加密接口名
  例如此处接口名为/xxxxxxing1/f**dinfo/getfundranklist/1.0,可以搜其拆分的路由名称:xxxxxxing1f**dinfogetfundranklist
  1.3、搜索相关涉及到加签加密的参数名
  例如此处则可以搜索oftypeopenapi_signparamsDigestordercol等
  在介绍完背景和方法后,可以开始寻找加签函数了。
  定位加签函数
  在相关开发者工具中,全局搜索openapi
  
  发现有两个js存在,进入这两个js继续定位关键的位置。
  发现openapi关键字都存在于同一个关键函数(说明:这里后面经过对比两个js文件,发现内容大致相同而app-service.js不存在乱码情况,故后面都以此js进行跟踪分析)
  
  openapi_sign参数存在于getSecretSign方法中,同时另外⼀个请求体里的参数paramsDigest也 在⾥⾯,这根据这个命名⼤概推测该⽅法可能是⽤于签名。
  
  继续搜索此方法名getSecretSign,看看该方法是否有被调用到,发现了关键形参:t.data、 r.secretkey。
  
  继续上下⽂搜索t.data,发现⼀个关键点,阅读相关js代码,发现⾥⾯的 json字符串就是从数据包参数 ⾥⾯获取的,然后调⽤Object.assign⽅法将json串复制到t.data当中。
  
  由于r.secretkey未能搜索到,故尝试搜索secretkey关键字看看能不能找到些啥,发现刚好存在 ⼀个secretkey,至此可以⼤致判定我们最初找的getSecretSign为加签⽅法。
  
  0x04 编写加签函数
  本地起一个js脚本,将0x03中找到的加签函数写入,提供必要的参数值,运行测试下。
  
  结果报错提示r对象未被定义,阅读代码发现,r对象只是用于提供它的hex()方法,返回项目源码当中寻找hex()方法。
  
  然后往上面跟代码发现此处是引用了github上的一个MD5加密算法github。
  这里直接将src目录下的md5代码复制下来,贴到我们测试的js文件当中。
  
  执行js脚本文件,无报错。同时对⽐发现签名⼀致。⾄此相关加签函数已找到并能成功调⽤运⾏。
  
  
  0x05 联动burp插件
  加签算法已破解,为了能更提高实际渗透测试过程中的效率,可以联动burp插件,使得当我们篡改数据时能自动化的运行加签算法,直接得到相关签名。
  在这里我首先尝试了burpCrypto插件,但调试js阶段发现一直有报错,同时在插件上未找到详细错误信息,而jsencrypter会将错误信息直接地抛出在命令行页面上,更有利于代码调试,故此处选择的是jsencrypter插件。
  简单介绍一下jsencrypter插件:
  
  jsencrypter使用phantomjs启动前端加密函数对数据进行加密,方便对加密数据输入点进行fuzz,比如可以使用于前端加密传输爆破等场景。工具本身提供了几种常见加密算法,可以直接引用,当加密加签算法为非常规时,也可以引用我们自定义算法进行破解。
  phantomjs是已停产的无头浏览器,用于自动进行网页交互。PhantomJS提供了一个JavaScript API,可实现自动导航,屏幕截图,用户行为和断言,使其成为在无头系统(如持续集成环境)中运行基于浏览器的单元测试的常用工具。
  Jsencrypter的使用
  按照插件的说明,复制了一份原来的phantomJS调用模板,按照文档注释说明,修改了引用的js文件,以及后续调用的方法。
  
  在⽤于加签的js中,将在0x04章节中成功加签的js代码复制过来,并在后面给其设置一个get方法,用于返回签名。
  function get(pass){     var pass1 = eval("("+pass+")");     var call = test(pass1,t);     var str = 'paramsDigest:'+call.paramsDigest+'-------'+'openapi_sign:'+call.openapi_sign;     return str;     }
  命令行中敲入命令,运行phantomjs
  >phantomjs js1.js[*] load js successful[!] ^_^[*] jsEncrypterJS start![+] address: http://127.0.0.1:1664
  然后bp上点击test发送数据,可以看到相关的sign值完全正确。(此处sign值与前面图对应)
  
  自动化改进
  原先js脚本,只是回显了sign,但实际过程中,我们还是需要cv⼤法将openapi_signparamsDigest以及我们篡改后的数据串值重新丢⼊repeater中,其实可以通过js正则,进⾏修改输出,省去这⼀步。
  首先定义一个unchange方法,用于将json串转成参数串。
  function unchange(b){  var str = b,p1;  p1 = str.split(':"').join('=');  p1 = p1.split('",').join('&');  p1 = p1.replace('{','');  p1 = p1.replace('"}','');  return p1;}
  然后连接符+缝合起来
       var str = unchange(pass)+'&paramsDigest='+call.paramsDigest+'&openapi_sign='+call.openapi_sign;     return str;
  看看实际效果
  
  可以直接在插件上篡改参数值,然后复制结果到repeater中进行安全测试。
  
  自动化改进2
  但是这个地方,我们还是需要将数据先转化成非标准的json字符串。这里我尝试了在插件里面的js中进行修改,但是由于相关数据本身就包括了xxx&amp;xxx1&amp;xxx2,而&amp;在HTTP请求中会当做一个分割参数符,这会导致参数传到server端中时,只剩下一个xxx参数,其余的都被丢弃了。
  这里本想先将数据base编码,再传输过去,但思考下其实多此一举,在调用插件前还需要编码,加密前还需要先解码,这更复杂,还不如直接写个js,将数据转成json字符串后再丢给插件。
  故使用曲线救国的方式,写了一个js,用于自动化生成json串。
  function change(b){  var str = b,p1;  p1 = str.split('=').join(':"');  p1 = p1.split('&').join('",');  p1 = p1.replace(/^/,'{');  p1 = p1.replace(/$/,'"}');  return p1;}<br />var str = 'secuid=JY208740&udid=&sysVer=5.7.7&appName=&systemInfo=%2C%2C%2C&softName=WXIN_O&tradeClient=H5Trade&device_model=&deviceVers=&hwID=&conn_style=2.460.01.0.0&mip=&mac=&imsi=&iccid=&rNetAddr=&packtm=&reqtime=&operway=W&operorg=&netAddr=13888888888&session=12f4530351a3********7b6d8dec3c36f60dce1e83e03329d42fc269&userCode=334507******1792&pkg=H_117292&fundid=';  console.log(change(str));
  
  至此,除了需要手动执行转化数据串为json串外,勉强实现了自动化修改数据(不是
  0x06 涉及到的工具下载方式
  以上工具可到原文中下载:
  包含以下工具:
  第一次写文章,有什么不对的地方还请各位师傅斧正。
  【火线Zone云安全社区群】
  进群可以与技术大佬互相交流
  进群有机会免费领取节假日礼品

php正则函数抓取网页连接(php正则函数抓取网页连接表达式?相反,应该是选择器才更靠谱)

网站优化优采云 发表了文章 • 0 个评论 • 49 次浏览 • 2022-04-20 02:04 • 来自相关话题

  php正则函数抓取网页连接(php正则函数抓取网页连接表达式?相反,应该是选择器才更靠谱)
  php正则函数抓取网页连接
  php正则表达式?
  相反,应该是选择器才更靠谱。选择器虽然不能响应处理,但是可以有意的识别网页的全部内容。
  原来提问者不认为正则表达式比选择器高级。好吧。这么认为的问题,就等于自问自答。如何追到上山养老的杨树林,
  正则主要用来识别网页上的文字
  php正则表达式(豆瓣)
  可以设计一个选择器的解析器
  正则(gbk)主要用于文本的识别,web服务器中使用正则表达式来查找网页上的字符串(不包括注释),将字符串中的文本提取出来。
  就是把一串文本转换成某种对应的字符串。
  你可以参考爬虫比赛的内容,
  把你的任务分解。大致可以分为图片爬取,数据库爬取,二维二度空间的网页抓取。这些任务中图片爬取和数据库抓取比较容易实现,但因为图片中的url不止一个,所以爬取出来的jpg图片的总大小要进行缩放。但二维二度空间的网页抓取就很难了,因为不止涉及到二维空间,三维空间也要考虑,而且大部分图片是扫描二维空间的,所以有可能出现抓取太频繁,甚至更新失误的情况,让人抓不到图片内容。
  那么我们可以再用正则表达式把我们的任务分解,图片爬取要涉及的是二维网页,因此我们可以在抓取二维网页时使用图片的最简单的一维正则来识别,如下:[a,b,c,d,e]这里使用的是四组正则:。
  2、
  3、
  5、7或其他正则分组,要达到和二维正则一样的识别效果。这样就可以对图片进行定位了。数据库网页中的爬取也差不多这样,但不用二维正则,要完成类似的任务要通过列表来完成,拿一个最简单的工作来说,我们假设有个java的写的客户端爬虫,里面有一个二维的数据库图片文件,通过在文件中引入这个二维文件做二维正则匹配。
  那么如果爬取的时候速度和效率比较高,我们可以把它分别上传到不同的服务器,服务器都是具有数据库访问权限的。那么这个客户端爬虫就可以多次爬取图片文件。我们可以利用这些服务器上已有的数据,提供多个任务版本,像爬取img中的整个字符串,只用爬取一个二维空间的字符串,甚至同时爬取上千个图片中的某一张(对于一个应用程序一般能支持的场景很有限)这些不同任务版本,我们都可以采用正则表达式来匹配。
  那么对于一个应用程序而言,它实际上是一个工具,用来满足我们一定的功能需求。而当我们把它作为一个程序去使用时,它就对应这工具的目的,我们可以通过正则的匹配方式来给一个应用程序分级。从而使代码在具体应用场景中不至于过于臃肿。那么是否选择正则而不用正则呢?应该是一起使用。就像上。 查看全部

  php正则函数抓取网页连接(php正则函数抓取网页连接表达式?相反,应该是选择器才更靠谱)
  php正则函数抓取网页连接
  php正则表达式?
  相反,应该是选择器才更靠谱。选择器虽然不能响应处理,但是可以有意的识别网页的全部内容。
  原来提问者不认为正则表达式比选择器高级。好吧。这么认为的问题,就等于自问自答。如何追到上山养老的杨树林,
  正则主要用来识别网页上的文字
  php正则表达式(豆瓣)
  可以设计一个选择器的解析器
  正则(gbk)主要用于文本的识别,web服务器中使用正则表达式来查找网页上的字符串(不包括注释),将字符串中的文本提取出来。
  就是把一串文本转换成某种对应的字符串。
  你可以参考爬虫比赛的内容,
  把你的任务分解。大致可以分为图片爬取,数据库爬取,二维二度空间的网页抓取。这些任务中图片爬取和数据库抓取比较容易实现,但因为图片中的url不止一个,所以爬取出来的jpg图片的总大小要进行缩放。但二维二度空间的网页抓取就很难了,因为不止涉及到二维空间,三维空间也要考虑,而且大部分图片是扫描二维空间的,所以有可能出现抓取太频繁,甚至更新失误的情况,让人抓不到图片内容。
  那么我们可以再用正则表达式把我们的任务分解,图片爬取要涉及的是二维网页,因此我们可以在抓取二维网页时使用图片的最简单的一维正则来识别,如下:[a,b,c,d,e]这里使用的是四组正则:。
  2、
  3、
  5、7或其他正则分组,要达到和二维正则一样的识别效果。这样就可以对图片进行定位了。数据库网页中的爬取也差不多这样,但不用二维正则,要完成类似的任务要通过列表来完成,拿一个最简单的工作来说,我们假设有个java的写的客户端爬虫,里面有一个二维的数据库图片文件,通过在文件中引入这个二维文件做二维正则匹配。
  那么如果爬取的时候速度和效率比较高,我们可以把它分别上传到不同的服务器,服务器都是具有数据库访问权限的。那么这个客户端爬虫就可以多次爬取图片文件。我们可以利用这些服务器上已有的数据,提供多个任务版本,像爬取img中的整个字符串,只用爬取一个二维空间的字符串,甚至同时爬取上千个图片中的某一张(对于一个应用程序一般能支持的场景很有限)这些不同任务版本,我们都可以采用正则表达式来匹配。
  那么对于一个应用程序而言,它实际上是一个工具,用来满足我们一定的功能需求。而当我们把它作为一个程序去使用时,它就对应这工具的目的,我们可以通过正则的匹配方式来给一个应用程序分级。从而使代码在具体应用场景中不至于过于臃肿。那么是否选择正则而不用正则呢?应该是一起使用。就像上。

官方客服QQ群

微信人工客服

QQ人工客服


线