Natas Wargame Level27 Writeup(SQL表的注入/溢出与截取)
前端:
```
natas27
Username:
Password:
未启用会话/cookie
sourcecode:
0){
return True;
}
return False;
}
function validUser($link,$usr){
$user=mysql_real_escape_string($usr);
$query = "SELECT * from users where username='$user'";
$res = mysql_query($query, $link);
if($res) {
if(mysql_num_rows($res) > 0) {
return True;
}
}
return False;
}
function dumpData($link,$usr){
$user=mysql_real_escape_string($usr);
$query = "SELECT * from users where username='$user'";
$res = mysql_query($query, $link);
if($res) {
if(mysql_num_rows($res) > 0) {
while ($row = mysql_fetch_assoc($res)) {
// thanks to Gobo for reporting this bug!
//return print_r($row);
return print_r($row,true);
}
}
}
return False;
}
function createUser($link, $usr, $pass){
$user=mysql_real_escape_string($usr);
$password=mysql_real_escape_string($pass);
$query = "INSERT INTO users (username,password) values ('$user','$password')";
$res = mysql_query($query, $link);
if(mysql_affected_rows() > 0){
return True;
}
return False;
}
if(array_key_exists("username", $_REQUEST) and array_key_exists("password", $_REQUEST)) {
$link = mysql_connect('localhost', 'natas27', '');
mysql_select_db('natas27', $link);
if(validUser($link,$_REQUEST["username"])) {
//user exists, check creds
if(checkCredentials($link,$_REQUEST["username"],$_REQUEST["password"])){
echo "Welcome " . htmlentities($_REQUEST["username"]) . "!
";
echo "Here is your data:
";
$data=dumpData($link,$_REQUEST["username"]);
print htmlentities($data);
}
else{
echo "Wrong password for user: " . htmlentities($_REQUEST["username"]) . "
";
}
}
else {
//user doesn't exist
if(createUser($link,$_REQUEST["username"],$_REQUEST["password"])){
echo "User " . htmlentities($_REQUEST["username"]) . " was created!";
}
}
mysql_close($link);
} else {
?>
Username:
Password:
```
代码看起来存在很多注入点,但是都很难实现:一是通过了[mysql-real-escape-string](http://php.net/manual/zh/function.mysql-real-escape-string.php) 转义,想要绕过的话也很困难:$password使用''括起来了,无法用like wildchar和number绕过([参见](http://www.sqlinjection.net/advanced/php/mysql-real-escape-string/) )。
继续分析,总结流程如下:
Receive Input -> Check if user exist -> ifexist check credentials -> show data.
Receive Input -> check if user exist -> if dosen't -> create user.
同时,验证用户名/密码是否正确也仅仅是看返回数组是否>0
很容易联想到,如果我们插入一个和目标账目相同的行,即使我们不知道密码,function checkCredentials($link,$usr,$pass)的查找结果数组也会>0并返回true,接着function dumpData($link,$usr)就可能回显真正的用户与密码了。(注意这里只会回显一行,虽然dumpData里面是个while循环,但里层直接return print_r($row,true)了)
插入要实现两点:
function validUser($link,$usr)查找不到用户。- 存储后的username要和目标username相同,密码自己定。
这里还要参考两个mysql里面的知识点 :
- 字符串存储时若发生“溢出”,mysql会自动truncate到最大宽度。
- 空格在varchar里面会被自动删除。
所以,正确的插入可以是这样“natas28+连续空格(此处超过64字节)+xxx”,密码随意,可以为空。(注意,后面的xxx是必须的,因为在mysql中'natas28'='natas28+空格'),比较username时mysql并不会对提交的username进行truncate,所以判断用户名不存在,开始新建用户名和密码。一旦开始存储,就会发生溢出/截取,导致出现两个username同为‘natas28’的行。接着返回登录界面,输入natas28+密码。找寻操作会返回刚刚插入的数组(>0),所以查询成功,回显用户名和秘钥,这时回显的就是第一个nata28那行,即我们要获得的flag。
<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
</head>
<body>
<h1>natas27</h1>
<div id="content">
Welcome natas28 !<br>Here is your data:<br>Array
(
[username] => natas28
[password] => JWwR438wkgTsNKBbcJoowyysdM82YjeF
)
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>
突然发现有一个利用开头“5分钟重置”来进行注入的例子,思路是一样的,实现方法不一样(即重置后先于正常的NATAs28注入进去):
From:http://www.voidcn.com/blog/lyover/article/p-4915422.html
import requests
data={'username':'natas28','password':''}
auth=requests.auth.HTTPBasicAuth('natas27','55TBjpPZUUJgVP5b3BnbG6ON9uDPVzCJ')
while 1:
re=requests.post("http://natas27.natas.labs.overthewire.org",auth=auth,data=data)
if 'Wrong password' not in re.text:
print(re.text)
break
Natas Wargame Level27 Writeup(SQL表的注入/溢出与截取)的更多相关文章
- Natas Wargame Level26 Writeup(PHP对象注入)
源码: <?php // sry, this is ugly as hell. // cheers kaliman ;) // - morla class Logger{ private $lo ...
- Natas Wargame Level20 Writeup(会话状态注入/篡改)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArMAAACmCAYAAADJYwcaAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF
- Natas Wargame Level25 Writeup(头部注入+POST/GET注入)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArsAAAC8CAYAAAB4+WYTAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF
- 转:Natas Wargame Level28 Writeup(EBC加密破解)
From:http://alkalinesecurity.com/blog/ctf-writeups/natas-28-getting-it-wrong/ Now that I knew it was ...
- sql server手工注入
sql server手工注入 测试网站testasp.vulnweb.com 1. http://testasp.vulnweb.com/showforum.asp?id=0 http://testa ...
- SQLmap是一款用来检测与利用SQL漏洞的注入神器。
sqlmap 重要参考 http://www.kali.org.cn/forum-75-1.html SQLmap是一款用来检测与利用SQL漏洞的注入神器.开源的自动化SQL注入工具,由Python写 ...
- DVWA中SQL回显注入
一.SQL注入简介 1.1 SQL语句就是操作数据库的语句,SQL注入就是通过web程序在数据库里执行任意SQL语句. SQL 注入是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问和修改数据, ...
- (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
原地址:blog.csdn.net/lvjin110/article/details/28697695 like 语句拼sql 如何防止注入攻击?http://bbs.csdn.net/topics/ ...
- [转]sql二次注入
01 二次注入原理 二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入.防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据 ...
随机推荐
- C++使用htslib库读入和写出bam文件
有时候我们需要使用C++处理bam文件,比如取出read1或者read2等符合特定条件的序列,根据cigar值对序列指定位置的碱基进行统计或者对序列进行处理并输出等,这时我们可以使用htslib库 ...
- 【解决方案】纯js动态克隆表一行元素
1 m = 0 ;// 用于区分input // 新增一条录入 function AddTR(){ m += 1; var tableObject = document.getElementById( ...
- Unity3D高性能战争迷雾实现
效果图 先上效果图吧,这是为了吸引到你们的ヽ(。◕‿◕。)ノ゚ 战争迷雾效果演示图 战争调试界面演示图 由于是gif录制,为了压缩图片,帧率有点低,实际运行时,参数调整好是不会像这样一卡一顿的. 战争 ...
- 一步一步教你用c# entity framework6 连接 sqlite 实现增删改查
使用entity framework6 连接 SQLite 数据库 前言 很多小型应用程序中,都要使用数据库,而现在比较流行的本地数据库非SQLite莫属. 第一步:前期准备 开发环境:vs2015 ...
- flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台
**背景: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够, 2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他 ...
- HCTF
题目:魂斗罗 介绍:这个是HCTF里面的杂项,很好玩的, 1,这个看链接可以下载(http://139.224.54.27/gogogo/hundouluo.nes),然后在网上下载一个虚拟器(htt ...
- 高性能分布式执行框架——Ray
Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...
- C++雾中风景3:const用法的小结
const作为C与C++共有的关键字,很多使用的方式大同小异.但由于C++是一门面向对象的语言,在类和对象中有更多的使用规则.之前学习C语言的时候就被const这个关键字搅得焦头烂额,正巧也借这篇文章 ...
- python之列表(list)的使用方法介绍
python之列表(list)介绍 在python的使用过程中,我们经常会用到列表,然而经常会遇到疑惑,下面我将详细介绍下列表使用方法. 一.列表 列表经常用到的功能使增.删.改和查功能. 1. 增 ...
- 0:A+B Problem-poj
0:A+B Problem 总时间限制: 1000ms 内存限制: 65536kB 描述 Calculate a + b 输入 Two integer a,,b (0 ≤ a,b ≤ 10) 输出 ...