【问题标题】:SQL injection from an Active Directory来自 Active Directory 的 SQL 注入
【发布时间】:2015-06-10 13:04:47
【问题描述】:

我有一个我不明白的问题。我想制作一个 php 脚本来填充 Active Directory 中的一些 sql 表。

这是我的代码的一部分: $result=ldap_list($connect, "OU=PROFS,".$base_dnref, "(ou=*)");

$res = ldap_get_entries($connect, $result);

for ($i=0; $i < $res["count"]; $i++) {
$result2=ldap_list($connect, "OU=".$res[$i]["ou"][0].",OU=PROFS,".$base_dnref, "(cn=*)");
$res2 = ldap_get_entries($connect, $result2);
for($j=0;$j<$res2["count"];$j++){

    $insert=$db->query("INSERT INTO PROFESSEURS(NOM) VALUES ('".$res2[$j]["cn"][0]."')");
    $insert->fetch();
}
}




$result=ldap_list($connect, "OU=ELEVES,".$base_dnref, "(ou=*)");

$res = ldap_get_entries($connect, $result);

for ($z=0; $z < $res["count"]; $z++) {

$insert=$db->query("INSERT INTO CLASSE(NUMERO) VALUES ('".strval($res[$z]["ou"][0])."')");
$insert->fetch();

$result2=ldap_list($connect, "OU=".$res[$z]["ou"][0].",OU=ELEVES,".$base_dnref, "(cn=*)");
$res2 = ldap_get_entries($connect, $result2);

for($y=0;$y<$res2["count"];$y++){

    $insert=$db->query("INSERT INTO ELEVE(NOM) VALUES ('".$res2[$y]["cn"][0]."')");
    $insert->fetch();

}
}



}
catch (PDOException $e) {
   print 'Exception : ' . $e->getMessage();
}`

问题是第一个双精度 for 工作得很好,但第二个没有。但是我使用了相同的语法。错误是:“异常:SQLSTATE [HY000]:一般错误”。

此外,查询$insert=$db-&gt;query("INSERT INTO CLASSE(NUMERO) VALUES ('".strval($res[$z]["ou"][0])."')"); 工作正常,但只处理一半的 Active Directory 数据,另一半则根本没有。我确定问题不是来自 LDAP 路径,我为此使用了 LDAPExplorerTool。

你能帮帮我吗?

【问题讨论】:

    标签: php sql active-directory ldap


    【解决方案1】:

    请用你的替换下面的代码:

    $res = ldap_get_entries($connect, $result);
    
    for ($i=0; $i < $res["count"]; $i++) {
    $result2=ldap_list($connect, "OU=".$res[$i]["ou"][0].",OU=PROFS,".$base_dnref, "(cn=*)");
    $res2 = ldap_get_entries($connect, $result2);
            for($j=0;$j<$res2["count"];$j++){
                    $NOM = $res2[$j]["cn"][0];//Store value into variable for further use...
                $insert=$db->query("INSERT INTO PROFESSEURS(NOM) VALUES ('".$NOM."')");
                $insert->fetch();
            }
    }
    
    $result=ldap_list($connect, "OU=ELEVES,".$base_dnref, "(ou=*)");
    
    $res = ldap_get_entries($connect, $result);
    
    for ($z=0; $z < $res["count"]; $z++) {
            $NUMERO = strval($res[$z]["ou"][0]);//Store value into variable for further use...
            $insert=$db->query("INSERT INTO CLASSE(NUMERO) VALUES ('".$NUMERO."')");
            $insert->fetch();
    
            $result2=ldap_list($connect, "OU=".$res[$z]["ou"][0].",OU=ELEVES,".$base_dnref, "(cn=*)");
            $res2 = ldap_get_entries($connect, $result2);
    
            for($y=0;$y<$res2["count"];$y++){
                    $NOM = $res2[$y]["cn"][0];//Store value into variable for further use...
                $insert=$db->query("INSERT INTO ELEVE(NOM) VALUES ('".$res2[$y]["cn"][0]."')");
    
    
                $insert->fetch();
    
            }
    }
    

    我在我有疑问的地方做了一些细微的改变。我建议使用 PDO 语句,因为旧的现在已经贬值了。

    如果您仍然遇到错误,请告诉我,我们可以深入研究以解决该问题。

    谢谢!

    【讨论】:

    • 在我的浏览器上,您的脚本出现“异常:SQLSTATE[HY000]:一般错误”。数据库中只有一行id为163,我觉得很奇怪。
    • 你能评论一下吗:$insert->fetch();如果它不需要。此外,我的系统上没有遇到“异常:SQLSTATE [HY000]:一般错误”。如果有任何变化,请告诉我。
    • 我做了,但是当我运行脚本并且只填充了 PROFESSEURS 表时出现了同样的错误。就算有错误,你之前提出的代码只填CLASSE表,我觉得这太随意了,我迷路了……
    • 此“致命错误:SQLSTATE[HY000]:一般错误”生成,而 mysql 似乎仅对 DB 执行操作存在问题。您需要通过检查 mysql 错误日志(mysql.log) 文件来手动检查。这个错误日志给你一些关于mysql错误的提示。请检查并让我知道是否有更多帮助。
    • 很抱歉占用您更多时间,但我只在 phpmyadmin 上工作,当我查看二进制日志时,我什么也看不到。你能告诉我怎么读吗?
    【解决方案2】:

    我解决了这个问题。 它来自查询的语法。我替换:

    $insert=$db->query("INSERT INTO ELEVE(NOM) VALUES ('".$res2[$y]["cn"][0]."')"); $insert->fetch();

    作者:$insert=$db-&gt;exec('INSERT INTO ELEVE(NOM) VALUES ("'.$res2[$y]["cn"][0].'")');

    这么多时间……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多