expect命令注入

发布时间 2023-07-21 11:18:48作者: 少年阿丁

基础知识

Expect 是 Unix 系统中用来进行自动化控制和测试的软件工具 , 作为 Tcl 脚本语言的一个扩展,应用在交互式软件中

  • spawn命令启动新的进程来进行交互式的运行,spawn后的send和expect命令都是和spawn打开的进程进行交互的。
  • send命令接收一个字符串参数,并将该参数发送到进程。
  • expect命令等待一个进程的反馈,支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。expect还能理解一些特殊情况,如超时和遇到文件尾。

当使用交互式expect命令send密码的场景下,当未对外部输入数据进行转义校验时,可能存在命令注入的风险

expect工作原理

spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出。

简单实例

[root@localhost ~]# vim test.sh				=>	一般将expect脚本的后缀命名为".sh"
 
 
#!/usr/bin/expect			=>	expect的解析器,与shell中的#!/bin/bash类似
set timeout n				=>	设置超时时间n秒,表示下面的代码需在n秒钟内完成(-1代表永不超时),如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住 
set name "12345"			=>	set设置变量,name的值为123456
 
 
spawn command1 command2..				=>	执行命令,也可以将变量作为命令输入
expect{									=>	接受执行命令返回的信息
 
"accept1" {send "instruction1\r"; exp_continue}						=>	匹配到accest1,发送instruction1 指令并且\r 回车执行
 
"accept2" {send "instruction2\r"; exp_continue}			=>	匹配到accest2,发送instruction2 指令并且\r 回车执行,exp_continue表示循环匹配
 
"accept3" {send "\r"; exp_continue}									=>	匹配到accept3表示直接回车执行
 
"accept4" {send "$name\r"}								=>	匹配到accept4,将变量值作为指令,并且回车执行
}
 
expect eof                             =>结束这个进程

expect命令注入

[root@localhost ~]# ./test.sh 123456";system cat /flag;"				
 
 
#!/usr/bin/expect			
set timeout n				
set name $1			=>	当name的值由外部输入攻击者可控时
 
 
spawn command1 command2..				
expect{									
 
"accept1" {send "instruction1\r"; exp_continue}						
 
"accept2" {send "instruction2\r"; exp_continue}			
 
"accept3" {send "\r"; exp_continue}									
 
"accept4" {send "$name\r"}								=>	匹配到accept4,将变量值作为指令,执行外部传入的命令-{send "123456";system cat /flag;"\r"}
}
 
expect eof