Busybox for Windows httpd
Recently, I've been using Busybox for Windows a lot more and the latest version includes the ability to use the httpd applet with CGI integration!
Busybox for Windows
Documentation on the httpd applet.
This meant that when I was faced with trying to get data off an old iPad with a web browser with broken HTTPS, no other internet connectivity and no way of installing apps, I could use the httpd applet to copy data off it (if only in plain text).
I created an HTML file on my PC containing the following code:
<!DOCTYPE html> <html> <head> <title>Data Extraction</title> </head> <body> <h1>Test</h1> <form method=POST action="/cgi-bin/write.sh" type="multipart/formdata"> File Name: <input type="text" name="name" /><br /> Contents:<br /> <textarea name="contents" rows="5" cols="60"></textarea><br /> <input type="submit" value="Send"> </form> </body> </html>
This has a textbox for the filename (called "name") and one for the contents of the file (called "contents"). I simply had to copy the text of each file to the webpage individually on running this.
After creating the HTML page, I then created a subdirectory called "cgi-bin" (as required by the httpd applet) and placed in it the following as "write.sh":
#!/bin/ash if test ! -z "${CONTENT_LENGTH}"; then read -n ${CONTENT_LENGTH} -d '\x00' data fi printf "Content-type: text/plain\r\n\r\n" echo "Read ${CONTENT_LENGTH} byte(s)" if test ! -z "$data"; then echo "Data read: $data" if echo "$data"| grep 'contents\='; then echo "$data"|sed -e 's/^.*contents\=//'|sed -e 's/\&.*$//' > da.txt else echo "No Data Submitted!" exit 1 fi httpd -d "$(cat da.txt)" > dd.txt if test -z "$(cat dd.txt)"; then echo "No Data Submitted!" exit 2 fi if echo "$data"| grep 'name\='; then n=$(echo "$data"|sed -e 's/^.*name\=//'|sed -e 's/\&.*$//') else n='' fi mkdir -p "../Documents/" if test ! -z "$n"; then nd=$(httpd -d "$n"|sed -e 's/\.\./_/g'|sed -e 's#[\\\/\:\?\*\"\<\>\|]#_#g') nc="$(eval "ls $(echo "../Documents/${nd}*.txt"|sed -e 's/ /\\ /g')" 2>/dev/null|wc -l)" fau='' echo "Name count: $nc" if test "$nc" != '0' || test -f "../Documents/${nd}.txt"; then if cmp -s dd.txt "../Documents/${nd}.txt"; then echo "File already uploaded!" fau='1' else nd="${nd}-${nc}" fi fi if test -z "$fau"; then cp dd.txt "../Documents/${nd}.txt" echo "File saved as ${nd}.txt" fi else nc="$(eval "ls $(echo "../Documents/doc*.txt"|sed -e 's/ /\\ /g')" 2>/dev/null|wc -l)" nc="$(dc -e"$nc 1 + p")" echo "Document Number: $nc" cp dd.txt "../Documents/doc${nc}.txt" echo "File saved as doc${nc}.txt" fi fi echo "Using Method ${REQUEST_METHOD}" echo "From agent \"${HTTP_USER_AGENT}\""
This writes the text in the "contents" box to a file named as whatever is in the "name" box, appended with ".txt", saved in a "Documents" subdirectory, appending a number if a file with that name already exists and not copying anything if the file with that name is identical. If the "name" box is empty, "doc" followed by a number and then ".txt" is used instead. Lots of debug information is given to the subitter of the data as I needed to be sure things were going through correctly. Obviously, this code would be dangerous to run outside a secure network environment, but here it did the job fine.
Bare in mind, this script is very much a bodge, so do review the code and adjust as needed if you wish to use any of this.