命令注入和代码注入区别
之前我们讲过的都是代码注入,注入的代码相当于网页中新的代码,比如去执行数据库读取的操作,我们想办法插入一段代码去执行,这就是代码执行。
命令注入
命令注入执行的是系统中的命令,使目标服务器的命令在目标服务器上去执行我们想要执行的命令,系统命令的执行还是要基于某些函数的调度去实现的。
1、system函数
例如system函数执行系统命令并输出相应的结果:
String system(string command, int&return_var)
这里就给了个代码示例。
2、exec函数
system函数是关键函数,不论是CTF还是挖洞最初都要对弱点函数做追踪,第一个就是system,第二个就是exec。
不会因为返回值受限一定要把它把传递给某个变量才可以。
3、 passthru函数
String shell _exec(string command) command是要执行的命令
4、运算符
与shell_exec功能相同,执行shell命令并返回输出的字符串
加引号后会直接执行系统命令,比如说echo,执行ls那么它是输出的是ls,如果要执行的是反引号中的ls,相当于打印出ls命令执行之后的一个结构。
在实际过程中,想去嵌入还是比较困难的,变量可控,存在反引号之间的,反引号传递不了,我们可以控制变量靠后的值,不管是get还是post单引号还是双引号,传递上去的值肯定是在引号之间的。
命令执行的绕过
- 换行符
换行符,比如说%0a就相当于换了一行,%0d也就是回车符。连续指令,理解上可能就相当于SQL语句,比如说第一句select 123那么理论上来说,如果你真的是写完整语法的,肯定是用分号去结尾,然后另起一行下一句,包括PHP它也是以分号来做换一行一行结束的。那么在shell中也是用这样去使用的。我用把0d换成一个分