-
2021-12-02 09:55:11
代码注入是指攻击者通过网站类型注入相应的代码,这个代码以当前网站用户的权限执行系统命令,在高级事件中,攻击者可能溢出来提权导致整个web服务器的沦丧。
倘若攻击路径到/shell了,这种情况就很严重了,处理不好攻击者就要控制你整个服务器了,这个时候就需要专业IDC运营商的技术人员处理,一般用户在租用高防御服务器都会有售后技术服务,或者直接用五九盾网络服务器也不错,五九盾网络高防IDC机房针对游戏、金融、政企等多个行业客户提供全方位DDoS防护服务,包括高达8T全球,防护能力、无限CC攻击防护、SD-WAN专线回源主流云厂商、智能WAF防护、动态BGP线路、智能自动业务切换等功能。另外科普下Web服务器
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache、Nginx、IIS。
Web服务器是可以向发出请求的浏览器提供文档的程序。
1、服务器是一种被动程序:只有当Internet上运行其他计算机中的浏览器发出的请求时,服务器才会响应。
2、最常用的Web服务器是Apache和Microsoft的Internet信息服务器(Internet Information Services,IIS)。
3、Internet上的服务器也称为Web服务器,是一台在Internet上具有独立IP地址的计算机,可以向Internet上的客户机提供WWW、Email和FTP等各种Internet服务。
4、Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件反馈到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流,这就是人们常把它们称为HTTP服务器的原因。
Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序。
Web服务器的工作原理:
Web服务器的工作原理并不复杂,一般可分成4个步骤:连接过程、请求过程、应答过程以及关闭连接。
连接过程,就是Web服务器和Web浏览器之间所建立起来的一种连接。要查看连接过程是否实现,用户可以找到和打开socket这个虚拟文件(一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的“打开、读写和关闭”等操作)。这个文件的建立,意味着“连接过程”这一步骤已经成功建立。
请求过程,就是Web的浏览器运用socket这个文件向Web的服务器提出各种请求。应答过程,就是运用“HTTP协议”把在请求过程中所提出来的请求,传输到Web的服务器,进而实施任务处理,然后运用“HTTP协议”把任务处理的结果,再传输到Web的浏览器,同时在Web的浏览器上面,展示上述所请求的界面。
关闭连接,就是当上一个步骤:“应答过程”完成以后,Web服务器和Web浏览器之间断开连接的过程。Web服务器上述4个步骤环环相扣、紧密相联,逻辑性比较强,可以支持多个进程、多个线程,以及多个进程与多个线程相混合的技术。
更多相关内容 -
详解php命令注入攻击
2021-01-20 08:15:59这次实验内容为了解php命令注入攻击的过程,掌握思路。 命令注入攻击 命令注入攻击(Command Injection),是指黑客通过利用HTML代码输入机制缺陷(例如缺乏有效验证限制的表格域)来改变网页的动态生成的内容。从而... -
php命令注入攻击
2019-04-01 19:25:55这次实验内容为了解php命令注入攻击的过程,掌握思路。 命令注入攻击 命令注入攻击(Command Injection),是指黑客通过利用HTML代码输入机制缺陷(例如缺乏有效验证限制的表格域)来改变网页的动态生成的内容。从而...这次实验内容为了解php命令注入攻击的过程,掌握思路。
命令注入攻击
命令注入攻击(Command Injection),是指黑客通过利用HTML代码输入机制缺陷(例如缺乏有效验证限制的表格域)来改变网页的动态生成的内容。从而可以使用系统命令操作,实现使用远程数据来构造要执行的命令的操作。
PHP中可以使用下列四个函数来执行外部的应用程序或函数:system、exec、passthru、shell_exec。信息来源——合天网安实验室
命令攻击为什么会形成漏洞?
首先是因为应用需要调用一些执行系统命令的函数,比如上面说的php中的system等函数。其次,当用户能够控制这些函数中的参数,就可以将一些恶意的命令拼接到一个正常的命令当中,然后就会造成命令执行漏洞。
所以我们可以得出命令执行漏洞需要的条件:- 应用调用的执行系统命令的函数
- 用户可以对命令进行控制,从而拼接恶意命令
- 应用没有对用户的输入进行过滤或者过滤不严格
通过命令执行漏洞,我们可以读写一些服务器上的文件,并且这些文件是不想让用户看到的,比如密码类的敏感文件。而且,我们可以通过命令打开服务器的远程服务,这样就可以拿到服务器的shell,从而操控服务器或者这个网页。再者,我们还可以对内网进行进一步的渗透。
下面开始实验。
- 使远程服务器执行
whoami
的命令。(whoami命令是查询当前用户身份的命令,比如管理员或普通用户)
打开实验环境,如下图所示,我们要使其执行whoami
命令。
从返回的结果来看服务器应该是windows系统,后面有补充。
服务器中关键代码如下:
程序获取GET参数ip,然后拼接到system()函数中,利用system()函数执行ping的功能,但是此处没有对参数ip进行过滤和检测,导致可以利用管道符执行其它的系统命令,后面有管道符的补充。“|”在windows中的意思是:把前面的结果当成后面的输入,我们用
ip=127.0.0.1|whoami
来试一下
后面的命令执行成功,得到我们的身份是system“&”在windows中的意思是:两条命令一起执行,先执行前面再执行后面,我们用
ip=127.0.0.1&whoami
来试一下
可以看出whoami
命令并没有成功被执行,原因是在ulr中,“&”是一个连接符号,会被转义成“%26”,那我们直接使用“%26”,它就会被转义成真正的“&”,所以我们不妨使用ip=127.0.0.1%26whoami
再试一下
命令执行成功,可以看到服务器执行了两个命令(ping和whoami),我们的身份是system“||”在windows中的意思是:当前面一个执行失败,则执行后面的,我们用
ip=127.0.0.1||whoami
来试一下
这一次whoami
命令并没有被执行,这是因为前面的命令可以执行,我们只要把前面的命令搞成不能执行的,让它自动执行下一条命令,根据前面提供的关键代码,我们知道只要传入了正常的ip地址,命令(ping)就会成功执行,所以我们试试把ip地址消除,用ip=||whoami
来试一下
命令执行成功,我们的身份是system- 使远程服务器执行ipconfig命令
服务器的关键代码如下
补充一下:
preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
preg_match() 匹配成功一次后就会停止匹配,如果要实现全部结果的匹配,则需使用 preg_match_all() 函数。
header()函数的作用是:发送一个原始 HTTP 标头[Http Header]到客户端。标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔。这段代码对ip地址进行了简单的过滤,如果它匹配到,它会执行下面system那条命令,如果它没有匹配到,它就无法执行下面那条命令(即ping),也就是我们开始时看到的界面:
所以,我们想要让服务器执行ipconfig,首先想到的思路就是让它发生错误,执行失败,使用双管道让它执行ipconfig,接下来我们用ip=127.||ipconfig
试一下:
成功同理,我们使用单管道(
ip=127.0.0.1|ipconfig
)试一试:
成功继续,我们使用“%26”(
ip=127.0.0.1%26ipconfig
)试一试:
执行了两个命令,成功!知识补充
我们可以通过ping命令返回结果中的TTL项查看服务器的操作系统:LINUX——64 WIN2K/NT——128 WINDOWS系列——32 UNIX系列——255(前面为操作系统,后面为TTL值) 通过ping返回结果,看TTL值与哪项最为接近,服务器就是哪个操作系统。
我们ping一下百度的试试
TTL值为52,则它与64之间跨了12个路由,所以它的服务器应该是LINUX。接下来补充一些常用的管道符:
Windows系统支持的管道符如下:
- “|”:直接执行后面的语句。
- “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
- “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
- “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。
Linux系统支持的管道符如下:
- “;”:执行完前面的语句再执行后面的语句。
- “|”:显示后面语句的执行结果。
- “||”:当前面的语句执行出错时,执行后面的语句。
- “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。
- “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。
总结一下:这种需要分析代码的问题一定不能大意,需要认真读懂什么意思才能破解它的秘密。这次实验并不是很难,以前在做CTF——Web题有遇到过,那种跟这个差不多,通过分析代码构造url获取flag。
关注公众号获得更多文章!
如需转载,请注明原文出处,作者:vergilben -
ASP.NET防范SQL注入式攻击的方法
2021-01-02 22:47:47常见的SQL注入式攻击过程类如: ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。 ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,... -
1-Web安全——命令执行注入攻击
2020-09-06 20:44:12通常在程序开发过程中,应用程序需要调用一些外部程序时会用到一些系统命令相关函数。 例如在linux系统中,shell解释器就是用户和系统进行交互的一个接口,对用户的输入进行解析并在系统中执行。而shell脚本语言...目录
1. 系统命令执行
通常在程序开发过程中,应用程序在调用一些第三方程序时会用到一些系统命令相关函数。
例如在linux系统中,shell解释器就是用户和系统进行交互的一个接口,对用户的输入进行解析并在系统中执行。而shell脚本语言就是linux系统由各种shell命令组成的程序,具有其他普通编程的很多特点。
2. Web命令执行
常用的ASP,PHP,JSP等web脚本解释语言支持动态执行在运行时生成的代码这种特点,可以帮助开发者根据各种数据和条件动态修改程序代码,这对于开发人员来说是有利的,但这也隐藏着巨大的风险。
命令注入攻击(即Command Injection)是web应用程序对用户的输入提交的数据过滤不严格,导致攻击者构造恶意的特殊命令字符串的方式将数据提交到web应用程序中,从而执行外部程序或系统命令来进行攻击,非法获取目标服务器的数据资源。
命令注入攻击是挪威一名程序员在1997年意外发现的,他通过构造命令字符串的方式从一个网站上删除网页,就像从硬盘中删除一个文件这么简单。
3. 什么是PHP命令注入漏洞
php命令注入攻击是php语言中很常见的一种漏洞,通常web应用程序在调用php语言中的一些系统命令执行相关函数时,对用户的提交的数据没有进行合理的过滤或安全校验就作为函数参数执行产生的攻击。例如攻击者对网站写入一个php文件时,就可以通过php命令注入来实现向网站写入一个webshell文件,进一步实施渗透攻击。
4. PHP命令执行的函数
php中可以实现执行外部程序或系统命令的函数有:
- system
- exec
- passthru
- shell_exec
- popen
- proc_popen
4.1 system函数
在php中,命令执行函数主要的作用就是通过web应用程序执行外部程序或系统命令,例如web应用程序想要获取当前服务器系统的用户的话,就可以通过system函数来获取用户信息,构造代码如下:
<?php $cmd = $_GET["cmd"]; if(isset($cmd)) { echo "<pre>"; system("net user".$cmd); echo "<pre>"; } ?>
以上代码中变量cmd会动态接收用户输入的命令,作为system函数的命令参数并执行,然后将结果输出。由于web应用程序可以通过变量cmd接收用户的不同命令并执行,而攻击者则可能利用变量cmd提交恶意数据进行命令注入攻击获取服务器的数据信息。
例如攻击者想要查看当前服务器的用户和ip地址等信息,那么可以在URL地址中构造系统命令,如下所示:
http://www.dvwa.com/cmd/test.php?cmd=||%20ipconfig
system函数执行结果如下所示:
攻击者通过cmd变量构造|| ipconfig命令提交数据后,在后台进行拼接后其实就是一个“net user || ipconfig”这样的字符串,并将这个字符串作为参数传入到system函数中执行,并且system函数会先执行net user系统命令获取当前服务器的用户,接着在执行ipconfig命令查看服务器的ip地址信息,并将命令执行后的结果输出。
4.2 exec函数
exec函数跟system函数的作用类似,唯一不同的就是exec函数不会将执行后的结果输出,其函数原型如下:
string exec ( string $command [, array &$output [, int &$return_var ]] )
参数说明:
Command:表示要执行的命令
Output:这是一个数组,用于接收exec函数执行后返回的字符串结果
return_var:记录exec函数执行后返回的状态
exec函数测试代码如下:
<?php $cmd = $_GET["cmd"]; if(isset($cmd)){ echo "<pre>"; //output用于接收exec函数执行后的结果 $output = array(); //执行命令 exec($cmd , $output); echo "<pre>"; //将output中的结果输出 while(list($key , $value)=each($output)) { echo $value."<br/>"; } } ?>
构造测试URL:http://www.dvwa.com/cmd/test.php?cmd=dir c:\ ,读取目标服务器的C盘文件,执行结果如下:
exec函数执行完后,会将执行后的结果放入到output数组中,需要在代码中将结果展示出来。
4.3 passthru函数
passthru函数也是用于执行系统命令的,并且会将执行后的结果进行输出,需要注意的是该函数主要是应用在unix系统下。当unix系统的命令输出的结果是二进制数据时,并且需要将数据结果返回给浏览器,就需要用到passthru函数来代替system和exec函数。
函数原型:
void passthru( string $command[, int &$return_var] )
参数的说明可以参考之前的system,exec函数。
passthru函数的php代码如下:
<?php $cmd = $_GET["cmd"]; echo "<pre>"; //执行命令 passthru($cmd); echo "<pre>"; ?>
4.4 shell_exec函数
用于执行shell命令并将执行的结果以字符串的形式返回,但是不会将结果进行输出。
函数原型如下:
string shell_exec ( string $cmd )
shell_exec函数的测试代码如下:
<?php $cmd = $_GET["cmd"]; echo "<pre>"; print shell_exec($cmd); echo "<pre>"; ?>
利用shell_exec函数查看当前服务器的系统配置信息,执行结果如下:
4.5 popen函数
popen函数会将执行后的系统命令结果用一个文件指针的形式返回。
函数原型:
resource popen ( string $command , string $mode )
参数mode表示打开的文件的读写方式。
popen函数的利用代码:
<?php $cmd = $_GET["cmd"]; if(isset($cmd)){ echo "<pre>"; //将命令写入到文本 $cmd = $_GET["cmd"].">> 1.txt"; //执行系统命令 popen($cmd , "r"); echo "<pre>"; //打开并读写文本文件 $fp = fopen("1.txt" , "r"); if($fp){ while(!feof($fp)){ $content = fgets($fp); echo $content; } } fclose($fp); } ?>
popen函数的执行结果如下:
5. 特殊符号——反引号
在php中``反引号里的字符串内容会解析为系统命令并执行。
反引号利用代码:
<?php $cmd = $_GET["cmd"]; if(isset($cmd)){ echo "<pre>"; //会将反引号里的内容解析为系统命令并执行 print `$cmd`; echo "<pre>"; } ?>
6. 命令执行用到的运算符
在进行命令注入攻击,特别是绕过WAF的时候可以使用 && ,& ,| ,||等符号分隔命令:
1. “&&”符号:Command1&&Command2表示先执行Command1命令,执行成功后再执行Command2命令,否则就不执行Command2。
以net user&&whoami命令为例,结果如下:
前面的net user命令执行过程中出错了,那“&&”符号后面的whoami命令就不会再执行了。
2. “&”符号: Command1&Command2表示先执行命令1,无论成功与否,都执行命令2。
以whoami%26net user命令为例,URL地址栏中不能直接使用“&”符号,只能使用“&”符号的URL编码%26,执行结果如下:
虽然执行net user命令出错了,但后面的whoami命令依然能得到执行。
3. “||”符号: Command1||Command2表示使用“||”符号进行连接实现逻辑或功能,只有在Command1命令执行失败后才会执行Command2关于其用法参考system函数。
4. “|”符号:|符号表示管道,把上一条命令的输出作为下一条命令的参数,可参考system函数中的用法。
7. DVWA靶场——命令注入
打开DVWA靶场再把难度调成low级别,选择Command Injection,如下所示:
dvwa靶场提示输入一个ip地址,但是如果想要执行其他命令的话就可以结合命令执行用到的运算符进行配合,例如获取服务器系统的当前用户信息,就可以构造127.0.0.1|net user命令进行注入。
分析后台代码:
<?php if( isset( $_POST[ 'Submit' ] ) ) { //接收ip地址 $target = $_REQUEST[ 'ip' ]; //确定操作系统并执行命令 if( stristr( php_uname( 's' ), 'Windows NT' ) ) { $cmd = shell_exec( 'ping ' . $target ); } else { //linux系统发送4个ping包 $cmd = shell_exec( 'ping -c 4 ' . $target ); } //返回命令执行结果 echo "<pre>{$cmd}</pre>"; } ?>
后台对前台用户输入的命令没有做任何的过滤,直接把前端的输入作为命令执行函数的参数,并将执行后的结果返回。
把难度修改成medium级别,分析后台代码:
<?php if( isset( $_POST[ 'Submit' ] ) ) { //获取输入的命令 $target = $_REQUEST[ 'ip' ]; //过滤&& , ; $substitutions = array( '&&' => '', ';' => '', ); //通过str_replace进行过滤 $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); //确定操作系统并执行命令 if( stristr( php_uname( 's' ), 'Windows NT' ) ) { //windows $cmd = shell_exec( 'ping ' . $target ); } else { //linux or unix $cmd = shell_exec( 'ping -c 4 ' . $target ); } echo "<pre>{$cmd}</pre>"; } ?>
medium级别的dvwa靶场对“$$”和“;”符号进行了过滤,str_replace函数会对这两个符号进行匹配,如果匹配到则把该字符串用空字符串进行替换,那么我们在进行命令执行注入时就不能使用“$$”和“;”符号了。
因此可以使用“||”,“|”,“$”符号对目标进行命令注入,分别构造127.0.301.1||net user和127.0.0.1|net user命令进行注入:
把难度调成high级别,分析代码:
<?php if( isset( $_POST[ 'Submit' ] ) ) { $target = trim($_REQUEST[ 'ip' ]); //过滤列表 $substitutions = array( '&' => '', ';' => '', '| ' => '', '-' => '', '$' => '', '(' => '', ')' => '', '`' => '', '||' => '', ); $target = str_replace( array_keys( $substitutions ), $substitutions, $target ); if( stristr( php_uname( 's' ), 'Windows NT' ) ) { $cmd = shell_exec( 'ping ' . $target ); }else { $cmd = shell_exec( 'ping -c 4 ' . $target ); } echo "<pre>{$cmd}</pre>"; } ?>
后台对于所有的系统命令符号都进行了过滤,但是仔细分析发现,“|”符号后面对了一个空格,也就是说后台对于“|”符号的过滤还是不严格,因此我们可以利用这一点进行绕过。
由于“|”符号前面的命令必须执行失败出错,后面的ipconfig命令才会得到执行,那么需要保证192.168.1.100这个ip地址是ping不通的。
DVWA靶场安全设置为impossible级别:
php if( isset( $_POST[ 'Submit' ] ) ) { //校验tooken防止CSRF checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); $target = $_REQUEST[ 'ip' ]; //去除反斜杠 $target = stripslashes( $target ); //对输入的ip进行分割 $octet = explode( ".", $target ); //判断用户提交的数据是否为数字 if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) { $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3]; if( stristr( php_uname( 's' ), 'Windows NT' ) ) { $cmd = shell_exec( 'ping ' . $target ); } else { $cmd = shell_exec( 'ping -c 4 ' . $target ); } echo "<pre>{$cmd}</pre>"; } else { echo '<pre>ERROR: You have entered an invalid IP.</pre>'; } } generateSessionToken(); ?>
后台代码经过一系列的过滤,对于提交的数据格式只有为ip地址格式的才会被接收并执行,因此这里是不存在命令注入漏洞的。
8. eval注入攻击利用
php中的eval注入也可以实现命令注入,eval函数会将参数字符串作为php程序代码来执行,用户可以将php代码保存成字符串形式然后传递到eval函数执行。
函数原型:
mixed eval( string $code)
eval函数的参数code就是php代码字符串,攻击者可以通过eval的参数构造全部或部分字符串的内容实现命令注入。
测试代码:
<?php $cmd = $_GET["cmd"]; if(isset($cmd)){ echo "<pre>"; eval($cmd); echo "<pre>"; } ?>
在URL链接中http://www.dvwa.com/cmd/test.php?cmd=phpinfo(); 提交构造好的php字符串:
我们在URL中提交的“phpinfo();”字符串经过eval函数的处理,可以按照php代码来执行并返回结果。
9. 系统命令执行防御思路
1. 尽量减少命令执行函数的使用,可以在disable_functions中禁用掉,在php.ini文件中找到该选项,输入禁用的命令执行函数,以system函数为例:
禁用system函数之后,再次执行php代码就会报错:
Warning: system() has been disabled for security reasons in C:\wamp\www\dvwa.com\cmd\test.php on line 5 Call Stack
2. 命令执行的函数或方法的参数进行合理的过滤或校验
3. 参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义,该函数的用法可参考之前的文章。
-
命令注入漏洞
2021-10-06 11:44:10攻击者可以使用命令注入来执行系统终端命令,直接接管服务器的控制权限。 在开发过程中,开发人员可能需要对系统文件进行移动、删除或者执行一些系统命令。Java的Runtime类可以提供调用系统命令的功能。如下代码可...命令注入漏洞
原理
命令注入是指在某种开发需求中,需要引入对系统本地命令的支持来完成某些特定的功能。当未对可控输入的参数进行严格的过滤时,则有可能发生命令注入。攻击者可以使用命令注入来执行系统终端命令,直接接管服务器的控制权限。
在开发过程中,开发人员可能需要对系统文件进行移动、删除或者执行一些系统命令。Java的
Runtime
类可以提供调用系统命令的功能。如下代码可根据用户输入的指令执行系统命令。由于cmd参数可控,用户可以在服务器上执行任意系统命令,相当于获得了服务器权限。示例代码
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.lang.reflect.Proxy; @WebServlet(name="Command",urlPatterns = "/Command") public class Command extends HttpServlet { @Override public void init() throws ServletException{ } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String cmd = req.getParameter("cmd"); Process process = Runtime.getRuntime().exec(cmd); InputStream in = process.getInputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int i = -1; while ((i = in.read(b))!=-1){ byteArrayOutputStream.write(b,0,i); } PrintWriter out = resp.getWriter(); out.print(byteArrayOutputStream.toString()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } @Override public void destroy() { super.destroy(); } }
命令注入的执行结果如图
命令注入的局限
系统命令支持使用连接符来执行多条语句,常见的连接符有
|、||、&、&&
,其含义为符号 含义 |
前面命令输出结果作为后面命令的输入内容 ||
前面命令执行失败时才执行后面的命令 &
前面命令执行后继续执行后面的命令 &&
前面命令执行成功后才执行后面的命令 例如命令
ping www.baidu.com&ipconfig
的执行效果如图所示,先执行完ping
命令,后执行ipconfig
命令
对于Java环境中的命令注入,连接符的使用存在一些局限。例如如下代码,利用ping命令来诊断网络。其中url参数为用户可控,当恶意用户输入www.baidu.com&ipconfig
时,系统可以成功执行,但是Java运行环境中就不行,因为www.baidu.com&ipconfig
被当作一个完整的字符串而非两条命令,因此如下代码不存在命令执行漏洞。protected ByteArrayOutputStream ping(String url) throws IOException{ Process process = Runtime.getRuntime().exec("ping " + url); InputStream in = process.getInputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int i = -1; while((i = in.read(b)) != -1){ byteArrayOutputStream.write(b,0,i); } return byteArrayOutputStream; }
无法进行命令注入的原因
Runtime类中
exec
方法存在如下几种实现,显而易见,要执行的命令可以通过字符串和数组的方式传入。public Process exec(String command) throws IOException { return exec(command, null, null); } public Process exec(String command, String[] envp) throws IOException { return exec(command, envp, null); } public Process exec(String cmdarray[]) throws IOException { return exec(cmdarray, null, null); } public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException { return new ProcessBuilder(cmdarray) .environment(envp) .directory(dir) .start(); }
当传入的参数类型为字符串时,会先经过
StringTokenizer
的处理,主要是针对空格以及换行符等空白字符进行处理,后续会分割出一个cmdarray
数组保存分割后的命令参数,其中cmdarray
的第一个元素为所要执行的命令。经过处理后的参数www.baidu.com&ipconfig
成为ping
命令的参数,因此此时的连接符&
并不生效,从而无法注入系统命令。 -
XSS攻击和SQL注入攻击实验过程
2022-04-04 17:28:27(一)XSS攻击 1.XSS Alert; (1)访问www.dvssc.com,在Train中的Username输入:admin’or’1=1,登录网页,选择Mutillidae,在Core Contrals的Retister中注册Alice和Bob两个用户。 (2)以Alice身份登录,... -
命令注入 ~ chuddy’s Blog
2021-05-08 23:40:54简介命令注入(也称为shell注入)是一种web安全漏洞,它允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,通常会完全破坏应用程序及其所有数据。通常,攻击者可以利用OS命令注入漏洞来破坏宿主基础设施的... -
命令注入总结
2021-12-15 13:17:24文章目录命令注入总结原理常见的危险函数PHPsystemexecpassthrushell_execpopenproc_open反引号Pythonsystempopensubprocess.call/subprocess.runspawnJavajava.lang.Runtime.getRuntime().exec(command)Linux下常用... -
DVWA靶场-命令注入(commandInjection)
2022-01-09 21:34:44第二关:Command Injection(命令注入...PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一。 Low <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $target = $_REQUEST[ 'ip' ]; // Determine OS -
web安全专题(1)注入攻击
2020-07-02 15:28:50这一期就将第一类常见的网络攻击,注入攻击,常见的注入攻击有以下几类: xss sql注入 日志注入 命令注入 CRLF注入 一、xss 1、本质 xss叫跨站脚本攻击,为什么这里会分到注入这一模块呢,因为xss本质就是html注入,... -
SQL注入攻击入门
2021-11-19 09:11:44目录 一、SQL注入的原理 SQL注入漏洞的条件 二、SQL注入的危害 三、SQL注入的分类 1、注入点数据类型分类 ...SQL注入是一种针对后台数据库的攻击手段,攻击者把精心构造的恶意SQL命令插入到Web -
常见操作系统命令注入思路
2021-12-16 10:31:15渗透测试技能:命令注入思路总结 -
OS命令注入学习笔记
2019-09-22 14:41:35OS命令注入 调用OS命令引起的安全隐患: Web开发所使用的编程语言中,大多数都能通过Shell执行OS(操作系统)命令。通过Shell执行OS命令时,或者开发中用到的某个方法其内部利用了Shell时,就有可能出现OS命令被任意... -
什么是SQL注入攻击?
2020-05-18 22:56:40所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 -
SQL注入攻击与防御
2013-10-04 16:08:40本书包含所有与SQL注入攻击相关的、当前已知的信息,凝聚了由本书作者组成的、无私奉献的SQL注入专家团队的所有深刻见解。 什么是SQL注入?理解它是什么以及它的基本原理 查找、确认和自动发现SQL注入 查找代码... -
Web安全——命令注入漏洞详解
2020-06-09 11:55:00手把手入门命令注入漏洞 -
SQL注入攻击的原理、分类和防御方法
2019-02-27 10:17:05一.SQL注入攻击原理 恶意用户在提交查询请求的过程中将SQL语句插入到请求内容中,同时程序本身对用户输入内容过分信任而未对恶意用户插入的SQL语句进行过滤,导致SQL语句直接被服务端执行。 二.SQL注入攻击... -
SQL注入攻击原理与防御措施
2022-04-30 23:42:18所谓SQL注入,就是通过把SQL命令伪装成正常的HTTP请求参数传递到服务端,款骗服务器最终执行恶意的SQL命令,达到入侵目的。攻击者可以利用SQL注入漏洞,查询非授权信息,修改数据库服务器的数据,改变表结构,甚至是... -
sql注入攻击详解(原理理解)
2016-12-14 08:17:18其实sql注入漏洞就是一个。作为一个菜鸟小程序员,我对sql注入的东西了解的也不深入,所以抽出时间专门学习了一下。现在把学习成果分享给大家,希望可以帮助大家学习。下面我们就来看一下。 一、什么是sql... -
SQL注入攻击概述
2019-11-27 11:16:291988年,著名黑客杂志《Phrack》54期,一位名叫rfp的黑客第一次介绍了SQL注入攻击. 标准查询过程 SQL注入:攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,并且插入的恶意SQL命令会导致原油的SQL... -
注入攻击(一)
2018-09-17 00:55:10应用在何时容易受到攻击: 1,用户支持的数据没有经过应用程序的验证,过滤或净化;...一些常见的注入包括SQL、OS命令、ORM、LDAP和表达式语言(EL)或OGEL注入。所有解释器的概念是相同的,组织可以将SAST和DAST工... -
seedlab实验——SQL注入攻击
2021-07-24 00:02:27通过SQL注入攻击,掌握网站的工作机制,认识到SQL注入攻击的防范措施, 加强对Web攻击的防范。 二、实验原理 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义... -
浅谈SQL注入攻击与防御(适用于小白观看)
2020-06-12 19:18:11首先你要明白什么是SQL注入攻击 SQL注入式攻击技术,一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因,是由于程序员在编写Web程序时,没有对...SQL注入攻击原理:程序命令和用户数据(即用户输入)之... -
SQL注入攻击常见方式及预防方法
2020-08-13 12:30:35开发同事反馈有系统收到SQL注入的风险告警,整理一下SQL注入攻击常见方式及预防方法。 SQL注入攻击是输入参数未经过滤,直接拼接到SQL语句当中解析,执行达到开发者预想之外行为的攻击方式。 下面是网上找到的例子... -
常见SQL注入攻击方式
2018-11-21 11:04:53本文主要针对SQL注入的含义、以及...所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 具体来说,它是利用现有应用程序,将(恶意的)... -
Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)
2021-11-07 16:48:06文章目录注入SQL注入JDBC拼接不当造成SQL注入框架使用不当造成SQL注入不安全的反射命令注入代码注入表达式注入Spel表达式注入OGNL表达式注入模板注入 注入 SQL注入 JDBC拼接不当造成SQL注入 JDBC有两种方法执行SQL... -
sql注入攻击详解(二)sql注入过程详解
2016-07-04 17:06:36在上篇博客中我们分析了sql注入的原理,今天我们就来看一下sql注入的整体过程,也就是说如何进行sql注入,由于...SQL注入攻击的总体思路是: 1.发现SQL注入位置; 2.判断后台数据库类型; 3.确定XP_CMDSHELL可执行情 -
SQL注入攻击
2018-12-05 14:48:541.什么是sql注入呢 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的...当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储... -
SQL注入攻击与防御(安全技术经典译丛)
2013-02-19 14:51:29本书包含所有与SQL注入攻击相关的、当前已知的信息,凝聚了由本书作者组成的、无私奉献的SQL注入专家团队的所有深刻见解。 什么是SQL注入?理解它是什么以及它的基本原理 查找、确认和自动发现SQL注入 查找代码...