题目地址:/
靶场关了 能找到一题目 是一题吧
Pass-01
进去就说我不是admin 所以肯定是破解admin的账户密码拿到flag 点击下面的源码
<?phpif($_POST[user] && $_POST[pass]) {mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); //连接数据库mysql_select_db(SAE_MYSQL_DB); //设置数据库名$user = trim($_POST[user]);//这里需要post传输 一个user 下面一个 passwd2个字符串$pass = md5(trim($_POST[pass]));$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; //$sql是 判断 用户名密码是否一直 echo '</br>'.$sql;$query = mysql_fetch_array(mysql_query($sql));if($query[user]=="admin") { //检测上面的语句是否成立有返回就结果,然后在这里判断用户名是否为adminecho "<p>Logged in! flag:******************** </p>";}if($query[user] != "admin") {echo("<p>You are not admin!</p>");}}echo $query[user];?>
可以看见这里只需要让sql语句返回有结果且语句取值中user是admin就会输出结果。
所以这里的payload应该构造上面的
select user from ctf where (user='".$user."') and (pw='".$pass."')"
闭合这里的 user 然后让后面成立即可
admin') and 1=1#
Pass-02
题目地址:key在哪里?
题目问key在哪里 直接右键查看源代码 就找到了key
Pass-03
题目地址:你是在坑我?
同样找key 只有一个GIF图片 直接下载图片 然后转为txt访问
Pass-04
题目地址:/web6/
又是登录界面
<?phpif($_POST[user] && $_POST[pass]) {mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);mysql_select_db(SAE_MYSQL_DB);$user = $_POST[user];$pass = md5($_POST[pass]);//post的pass会进行过MD5加密处理$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'")); //查找用户名底下的pw表if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) { //要求是为假echo "<p>Logged in! Key: ntcf{**************} </p>";}else {echo("<p>Log in failure!</p>");}}?>
$query[pw]这块有数据就会回显真 不用管 strcasecmp($pass, $query[pw])对比 传入的pass跟查询输出的pw是否为一直的
这里如果让 select pw from ctf where user='$user' 这个语句变形为
select pw from ctf where user='admin1' union select md5(5)# 那么前面 user查询的就会为假 联合查询后面的md5就会正常输出
且这里满足输入的 5 通过post的md5加入的内容 和输入的 5 不匹配 所以可以绕过验证
所以 构造语句 就为用户名输入 admin1' union select md5(5)# 密码 输入5
Pass-05
题目地址:asdf
题目是点击触发后来到这里 一看就是文件包含 直接就用php伪协议去读取了show.php 但是内容啥也不是 回头来读index.php发现了key
Payload:php://filter/read=convert.base64-encode/resource=index.php(这句话是真的记了多少次都没搞定难顶 手写了几次 都输入错误)
Pass-06
/web8/
这题是进去就说 点击找key 然后点击后 直接跳转到 no_key_is_here_forever.php这个界面
用浏览器的view_source查看了源代码 发现他跳转的过程存在 search_key.php
读取该页面源代码 发现了key
Pass-07
题目地址:/web9/
同样的题目 以为也可以查看源代码过 试了一下不行 就用burpsuite抓包看了一下找到key
Pass-08
题目地址:Do you know robots.txt?
提示是看robots.txt 访问发现提示如下
代码审计题目 关键点 提到了一个sql.php的文件 访问方式是 GET请求一个id的内容 让id满足等于1024的要求
<?phpif($_GET[id]) {mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);mysql_select_db(SAE_MYSQL_DB);$id = intval($_GET[id]);$query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));if ($_GET[id]==1024) {echo "<p>no! try again</p>";}else{echo($query[content]);}}?>
这里用id=1025和id=1023还有一些值都会出内容但是不是flag
看题上面在对id传入的内容会有一个 intval的函数进行处理 所以这里传1024.1也会被当做1024来处理 这里传数组测试过 还是不行。
所以payload:sql.php?id=1024.1
Pass-09
题目地址:SuperSo | by:p0tt1
这题刚开始拿到以为是要用xss怎么访问都是去百度执行,寻思这也太恐怖了吧 然后就没敢仔细看。后来看了一下其实这题很简单就是要自信,一直要去追就可以了 。
查看根目录源代码
发现第一个文件 跟下去看源代码
发现第二个 在进去
之前做到这里就放弃了 以为是假的 没仔细看其实都不一样的
再进去
读取404.html
答案就在这里 我吐了。
Pass- 10
题目地址:/web14/
直接查看源代码就可以找到邮箱地址 这没什么难度
看了相关提示 说这是用vim编辑器编辑的 不知道最开始题目是否有提示 不然猜出来的也太牛逼了
然后访问 连接地址的submit.php的缓存 .submit.php.swp
触不及防的代码审计
if(!empty($token)&&!empty($emailAddress)){if(strlen($token)!=10) die('fail');if($token!='0') die('fail');$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";$r = mysql_query($sql) or die('db error');$r = mysql_fetch_assoc($r);$r = $r['num'];if($r>0){echo $flag;}else{echo "失败了呀";}}
本来 想在这里"SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'"; 这用token 写个 or的判断绕过算了 但是上面写了 token传值长度为10
这里放弃 看下面一句 判断token的内容如果不等于0 那么就直接杀 这句话也太猛了
回想两个条件 要求 token内容为0 长度为10 sql支持进制传递的 第一想到的就是16进制
从这里可以看见 二进制 是满足 要求的 也就是内容为 0e00110000的输入方式作为 token的内容满足所有条件 所以payload也就是 0e00110000